目录

  1. 本学期科研规划
  2. 第一周 2021/10/08 – 2021/10/15
    1. 本周工作情况和进展
    2. 存在的问题
    3. 下周工作计划
    4. 个人反思
  3. 第二周 2021/10/18 – 2021/10/24
    1. 本周工作情况和进展
    2. 存在的问题
    3. 下周工作计划
  4. 第三周 2021/10/25 – 2021/10/31
    1. 本周工作情况和进展
    2. 存在的问题
    3. 下周工作计划

本学期科研规划

  本学期的科研项目为使用SGX保护hyperledger-fabric区块链,目前已经成功部署fabric网络和SGX,对二者进行测试使用,并对fabric代码和SGX代码进行部分分析。
  计划十月份-十一月份能够初步结合fabric和sgx,完成简单的chaincode(智能合约)保护。
  在上述计划完成后,分析多种针对fabric的攻击方式,改进以上方案,抵御至少一种攻击行为。

第一周 2021/10/08 – 2021/10/15

本周工作情况和进展

  本周工作主要是阅读源码,包括ego、fabric的源码,理解编写细节。

  1. SGX文件分析
      SGX最重要的几个文件:
      EDL(Enclave Description Language)文件:声明可信函数和不可信函数,非可信区只能通过 ECALL 函数调用可信区内的函数。可信区只能通过 OCALL 函数调用非可信区的函数。

      xml文件:enclave的配置文件,如堆栈大小、线程数、是否可debug。

      sgx几个重要的工具(可执行文件,安装sgx时自动编译生成):
      sgx_edger8r:根据edl文件生成可信和不可信代码(c文件和头文件)
      sgx_sign:为enclaves签名

      除以上文件之外,在编写sgx程序时要将可信部分、不可信部分分开编写和编译,最后链接可信库和不可信库,然后链接成可执行文件。sgx程序的makefile往往很复杂,包括各种链接过程,因此是一个阅读难点。

  2. 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
    4
    oesign 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 with

      ego run 运行某一个特定的可执行文件
      run + filename
      使用ego-host(原型edgerless RT的erthost)

    1
    2
    3
    4
    erthost 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还未分析。

  3. fabric源码分析
      fabric安装和调用chaincode(智能合约)的命令如下:
    1
    2
    3
    4
    5
    6
    peer 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查询
      初步分析了fabric相关的代码,安装chaincode时会根据语言类型创建dockerfile,并进行编译,在调用chaincode时也会先构建容器,将chaincode放入容器中运行,因此这部分需要着重理解并改进,目前还在分析中。

存在的问题

  源码还未了解透彻,需要时间阅读。
  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运行即可。
  预计下周可以完成。