2021年10月科研月报
目录
本学期科研规划
本学期的科研项目为使用SGX保护hyperledger-fabric区块链,目前已经成功部署fabric网络和SGX,对二者进行测试使用,并对fabric代码和SGX代码进行部分分析。
计划十月份-十一月份能够初步结合fabric和sgx,完成简单的chaincode(智能合约)保护。
在上述计划完成后,分析多种针对fabric的攻击方式,改进以上方案,抵御至少一种攻击行为。
第一周 2021/10/08 – 2021/10/15
本周工作情况和进展
本周工作主要是阅读源码,包括ego、fabric的源码,理解编写细节。
- SGX文件分析
SGX最重要的几个文件:
EDL(Enclave Description Language)文件:声明可信函数和不可信函数,非可信区只能通过 ECALL 函数调用可信区内的函数。可信区只能通过 OCALL 函数调用非可信区的函数。
xml文件:enclave的配置文件,如堆栈大小、线程数、是否可debug。
sgx几个重要的工具(可执行文件,安装sgx时自动编译生成):
sgx_edger8r:根据edl文件生成可信和不可信代码(c文件和头文件)
sgx_sign:为enclaves签名
除以上文件之外,在编写sgx程序时要将可信部分、不可信部分分开编写和编译,最后链接可信库和不可信库,然后链接成可执行文件。sgx程序的makefile往往很复杂,包括各种链接过程,因此是一个阅读难点。 EGO源码分析
ego是edgeless system下的一个项目,edgeless system(https://www.edgeless.systems/)下都是可信计算相关的软件,如ego、edgelessDB、MarbleRun,以及edgeless RT(一个可信运行环境sdk)。
分析ego源码:
ego最重要的两个命令ego sign(为可执行文件签名)、ego run(为可执行文件创建enclave并运行)
ego sign + {exe可执行文件;json enclave配置文件;空} 三种类型文件
sign + exe 直接为可执行文件签名,首先会生成默认的json文件(enclave配置文件,和sgx的xml文件作用一致),然后生成公私密钥对,使用私钥进行签名。
sign + json或空
->调用readConfigJSONtoStruct ->调用unmarshal反序列化json字符串,调用Validate检验json文件数据,PopulateContent加密
->调用signWithJSON 读取json文件 -> 调用embedConfigAsPayload,将json文件嵌入exe文件中->调用createDefaultKeypair创建公私密钥对
->调用ego-oesign(原型openenclave的oesign)1
2
3
4oesign sign -e ego-enclave -c enclave.conf -k private.pem --payload helloworld
-e, --enclave-image path of an enclave image file.
-c, --config-file [optional] configuration file specifying the enclave properties.
-k, --key-file path to a private key file in PEM format to sign enclave image withego run 运行某一个特定的可执行文件
run + filename
使用ego-host(原型edgerless RT的erthost)1
2
3
4erthost ego/share/ego-enclave:helloworld
Usage: ./ego-host enclave_image_path [enclave args...]
Set OE_SIMULATION=1 for simulation mode.Erthost是一个用于运行飞地的工具。在开发期间,将飞地与ertdeventry连接起来。然后erthost将透明地将所有命令行参数和环境变量转发给enclave应用程序。飞地可以无限制地访问主机的文件系统
以上的可执行程序必须通过ertgo编译,不然无法生成enclave。
ertgo是一个经过改进的Go编译器,可以从给定的Go项目中构建与enclave兼容的可执行文件——同时提供与原始Go编译器相同的CLI。
ego和edgeless RT都是依靠openenclave sdk(https://github.com/openenclave/openenclave),openenclave和sgx类似,也是有对应的工具oeedger8r、oesign,和sgx的sgx_edger8r、sgx_sign一致:
ego sign本质就是调用oesign,而ego run是调用edgeless RT的erthost,erthost是在openenclave基础上开发而来,为可执行程序创建运行时的enclave。erthost还未分析。
- fabric源码分析
fabric安装和调用chaincode(智能合约)的命令如下:初步分析了fabric相关的代码,安装chaincode时会根据语言类型创建dockerfile,并进行编译,在调用chaincode时也会先构建容器,将chaincode放入容器中运行,因此这部分需要着重理解并改进,目前还在分析中。1
2
3
4
5
6peer lifecycle chaincode package mycc.tar.gz --path github.com/hyperledger/multiple-deployment/abstore --lang golang --label mycc
//chaincode打包,打包结果为压缩文件,包含一个json文件(chaincode路径、语言、标签)和源码go文件
peer lifecycle chaincode install mycc.tar.gz //将chaincode安装到节点上
peer chaincode invoke -c '{"Args":["Init","a","100","b","100"]}' //调用Init初始化
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
//调用query查询
存在的问题
源码还未了解透彻,需要时间阅读。
ego可以直接为单独的go程序创建enclave,使整个程序在enclave中安全运行。而chaincode不是独立运行的程序,需要与peer节点进行交互,也就是存在一些函数调用,调用部分需要单独放入enclave中,因此无法直接将ego嵌入fabric中使用。
fabric对chaincode的载入、编译、容器构建都是集成在peer命令中,因此需要单独将该部分拿出重新分析和编写,并集成ertgo(改良的go编译器)和ego的功能。
fabric源码调用过程繁杂,分析过程比较耗时。
下周工作计划
继续阅读源码,剖解fabric的peer命令,需要深入了解chaincode如何安装、怎么在内部编译和交互的。分析ego中erthost的原理,erthost直接为可执行程序创建enclave,需要将该功能改进成peer与chaincode交互时启动enclave。
个人反思
项目目前还处于分析阶段,需要分析很多代码,ego、fabric、edgeless RT等,很花时间,尤其是fabric,工程量比较大,调用关系复杂。理解原理是一回事,分析代码就是另一回事了。
因此现在还理解不透彻,没有什么好的实践想法,进度较慢。
下一步规划是优先分析代码,理解代码编写过程后再上手改进。
ps:以下想法未提交给老师看,个人吐槽。
整个实验都是留学生的毕业项目,我只是一个帮手,但是大部分都是我一个人做的,留学生来实验室的时间很少,经常就来几个小时,每天只看看原理,代码相关的实操根本不会。留学生学习能力很差,而且并不勤奋,对实验的付出不超过20%,而我却要累死累活地帮他做,每天要分析源码,思考解决方案,汇报做ppt。最后如果论文写出来了(虽然我觉得只靠我一个人做不出来),第一作者还是他的名字,我只能拿一个共同一作,因为他只有一作才能毕业。
唉,现在生活就很苦,我才来了两个半月,就要马上赶着发论文,现在时间紧迫,项目难度大,没有学长带,一个人孤军奋战,很是苦涩。
第二周 2021/10/18 – 2021/10/24
本周工作情况和进展
本周其他事情较多,并且在为新电脑配环境,因此没有什么新的进展。电脑的芯片支持sgx,但是主板不支持,因此在想办法和其他学长调换主板。
在分析ego和fabric时,突然有一个想法,将整个peer执行都放入ego的enclave中。因为上周分析过,ego只能为完整独立的可执行程序创建enclave,直接为chaincode这种需要交互的无法创建。而peer命令会与chaincode交互,也就是说peer运行过程是一个完整独立的过程,因此可以尝试使用ego run peer……来为整个peer运行创建enclave。虽然该方法并不是一个好的解决方案,但可以尝试一下。
首先需要使用改良的编译器ertgo来编译出peer可执行程序,然后用ego sign 为peer签名,使用ego run运行:
由上图单独使用ego run peer是可以正常运行的,但在实际的fabric网络中:
使用ego run peer来调用invoke,初始化ledger数据,但出错了,显示core文件找不到,core文件是fabric的配置文件,路径已经设置好了,找不到原因可能是enclave与外界隔离了,无法读取core文件。
存在的问题
目前项目还处于分析阶段,ego的原理还未解析清楚,因此工作进度过慢。
下周工作计划
抽时间在新电脑上配置fabric和sgx的硬件运行环境
完成chaincode的enclave运行或者peer的enclave运行。
第三周 2021/10/25 – 2021/10/31
本周工作情况和进展
本周在分析ego和fabric的工作原理后,发现了之前工作的误区。之前认为fabric的链码是需要交互的,无法单独使用ego运行。实际过程更为复杂,虽然结果看上去是peer调用了chaincode的函数,但实际上chaincode是一个独立的程序,它启动后会自动注册到peer上,建立gRPC链接来通信,然后peer调用chaincode中的函数功能,所以chaincode还是先自主启动,启动gRPC服务,再开始交互,这就说明可以使用ego run运行chaincode。
peer在安装链码时,会将整个链码包(tar.gz包,包含源代码.go和设置文件.json)复制到peer容器中,然后在初始化链码时,首先使用镜像fabric-ccenv来编译链码为可执行程序,然后使用镜像fabric-baseos来启动chaincode容器,运行链码,运行命令为
1 | chaincode -peer.address=saturn:7052 |
因此只要在两个镜像中集成ego,更改编译和运行方式即可。
接下来需完成ego启动的三步:ego-go编译,ego sign签名,ego run运行。
要修改镜像创建文件,安装ego和ertgo编译器。
修改镜像中编译go代码的部分,改为ego-go编译
修改chaincode启动代码部分,先签名,后启动。
存在的问题
目前没有什么问题,整个项目的问题就在于chaincode编译运行过程太过隐式,不在peer或者chaincode源码中设置,而是隐藏在镜像的代码中,很难去发现分析,因此查阅了很多资料,耗费时间。
下周工作计划
实现在镜像中集成ego和ertgo编译器,修改镜像中编译和启动的代码,更改为ego-go编译,ego sign签名,ego run运行即可。
预计下周可以完成。