aws / aws-nitro-enclaves-nsm-api

This provides a library for interacting with the Nitro Secure Module, which provides Nitro Enclaves with attestation capability.
Apache License 2.0
62 stars 43 forks source link

almost all PCRs in attestation document zero? #11

Closed Jonas-Metzger closed 3 years ago

Jonas-Metzger commented 3 years ago

Hi @petreeftime. For some reason most PCR measurements in the attestation document are zero.

{'cabundle': [b'0\x82\x02\x110\x82\x01\x96\xa0\x03\x02\x01\x02\x02\x11\x00\xf91uh\x1b\x90\xaf\xe1\x1dF\xcc\xb4\xe4\xe7\xf8V0\n\x06\x08*\x86H\xce=\x04\x03\x030I1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1\x1b0\x19\x06\x03U\x04\x03\x0c\x12aws.nitro-enclaves0\x1e\x17\r191028132805Z\x17\r491028142805Z0I1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1\x1b0\x19\x06\x03U\x04\x03\x0c\x12aws.nitro-enclaves0v0\x10\x06\x07*\x86H\xce=\x02\x01\x06\x05+\x81\x04\x00"\x03b\x00\x04\xfc\x02T\xeb\xa6\x08\xc1\xf3hp\xe2\x9a\xda\x90\xbeF82\x92sn\x89K\xff\xf6r\xd9\x89DKPQ\xe54\xa4\xb1\xf6\xdb\xe3\xc0\xbcX\x1a2\xb7\xb1v\x07\x0e\xde\x12\xd6\x9a?\xea!\x1bf\xe7R\xcf}\xd1\xdd\t_o\x13p\xf4\x17\x08C\xd9\xdc\x10\x01!\xe4\xcfc\x01(\tfD\x87\xc9yb\x840M\xc5?\xf4\xa3B0@0\x0f\x06\x03U\x1d\x13\x01\x01\xff\x04\x050\x03\x01\x01\xff0\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\x90%\xb5\r\xd9\x05G\xe7\x96\xc3\x96\xfar\x9d\xcf\x99\xa9\xdfK\x960\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x860\n\x06\x08*\x86H\xce=\x04\x03\x03\x03i\x000f\x021\x00\xa3\x7f/\x91\xa1\xc9\xbd^\xe7\xb8b|\x16\x98\xd2U\x03\x8e\x1f\x03C\xf9[c\xa9b\x8c=9\x80\x95E\xa1\x1e\xbc\xbf.;U\xd8\xae\xeeq\xb4\xc3\xd6\xad\xf3\x021\x00\xa2\xf3\x9b\x16\x05\xb2p(\xa5\xddK\xa0i\xb5\x01ne\xb4\xfb\xde\x8f\xe0\x06\x1djS\x19\x7f\x9c\xda\xf5\xd9C\xbca\xfc+\xeb\x03\xcbo\xee\x8d#\x02\xf3\xdf\xf6',
  b'0\x82\x02\xbe0\x82\x02D\xa0\x03\x02\x01\x02\x02\x10(P\xc5\xf45\x0e\x12\x8dZ\xcd\x9d\n-\xd2i\xfe0\n\x06\x08*\x86H\xce=\x04\x03\x030I1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1\x1b0\x19\x06\x03U\x04\x03\x0c\x12aws.nitro-enclaves0\x1e\x17\r210810174808Z\x17\r210830184808Z0d1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1604\x06\x03U\x04\x03\x0c-c6c4a82b17eaa51b.us-east-2.aws.nitro-enclaves0v0\x10\x06\x07*\x86H\xce=\x02\x01\x06\x05+\x81\x04\x00"\x03b\x00\x04\xbf8\xe1|\x8da\x17\xdc\x98E\xbc\xd8c\xa7\x19\x0e\xa6\xe2\x1b9\x8e\x1bPK\xb3\x082\x88\xa5E\x1f\xd3\xa8\xdeP\xa2!\x90g\xd5\xec\xf1i\x14\xe3\x97\x9b::\xb6\xb0\xb8x\xc7r!\xe3\xc3G\xf3\xb8\xa3\xb7_\x06\xcd\x06\x16\x04\xca\x0b\x16\x06\x88\xb5&!\x03\x8fLBl/\x8a<\x1fp]\r\xca\x1c\xac\x0e\x84d\r\xa3\x81\xd50\x81\xd20\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\x020\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\x90%\xb5\r\xd9\x05G\xe7\x96\xc3\x96\xfar\x9d\xcf\x99\xa9\xdfK\x960\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\x94\xf13\xf3\x8c\xc6\x12\x11\x0e\\\x89\xf1\xb7^m\x9aN\x04Q\xce0\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x860l\x06\x03U\x1d\x1f\x04e0c0a\xa0_\xa0]\x86[http://aws-nitro-enclaves-crl.s3.amazonaws.com/crl/ab4960cc-7d63-42bd-9e9f-59338cb67f84.crl0\n\x06\x08*\x86H\xce=\x04\x03\x03\x03h\x000e\x021\x00\xae\x02*\xa0e\xcb\x1ay\x0b\xc80ZJ<X\x05\xe5om\x16vEGp\xd7\x01\xf8$k4zuv\x83\n\x15FX\xc0\x0e&\xfdL\x0b\xa4\x07\xf4\x1f\x020r\xb6\xf0\x13\x1a\x9a\x06\xe7N\\/\xbbi3\xbbo\xcb\x92\x94\x18\xae\x1c\xf1\x08*3\xdeE\xad\x86\x82a4\xd9|\x8e\xff\x99\xd0Hj\xde\xb3{\x9c\r\x90Y',
  b'0\x82\x03\x160\x82\x02\x9b\xa0\x03\x02\x01\x02\x02\x11\x00\xba\xcd\xa7\x0e\x8e\x81$Q1\xeck\xf7DN\xda\x9e0\n\x06\x08*\x86H\xce=\x04\x03\x030d1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1604\x06\x03U\x04\x03\x0c-c6c4a82b17eaa51b.us-east-2.aws.nitro-enclaves0\x1e\x17\r210812140211Z\x17\r210818030211Z0\x81\x891<0:\x06\x03U\x04\x03\x0c333d4c88459a338f1.zonal.us-east-2.aws.nitro-enclaves1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x0b0\t\x06\x03U\x04\x08\x0c\x02WA1\x100\x0e\x06\x03U\x04\x07\x0c\x07Seattle0v0\x10\x06\x07*\x86H\xce=\x02\x01\x06\x05+\x81\x04\x00"\x03b\x00\x04\x81Z\xf1N\xd3\x00}\xe1RC6Q\x8c\xdb+l\xf0\x10\xee\xf7\xf5ogL}\xd7\x92\x05\x0br\xd1\xb7\xe1\x10\x90y8\x9c\xd7A \xea\xcc\xec+\x97\x95\x8d\xfe\xc1\x1bF\xed\x98\xcdA\x91"\x162\xa1=\xd7T\xe0ST\x1f&\x1dG\xcd\xee\xaeJ\xbfN\x0e\x06\xa1\x02\xfe\xc7U\x87\xc6E\x84\x83\xe5\xe8\x83\xebj\xb5u\xa3\x81\xea0\x81\xe70\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\x010\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\x94\xf13\xf3\x8c\xc6\x12\x11\x0e\\\x89\xf1\xb7^m\x9aN\x04Q\xce0\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xadw\xd6\xefu  \xd6\xca@+!\xff\x99\x98;\x93\xd4\x06\xf30\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x860\x81\x80\x06\x03U\x1d\x1f\x04y0w0u\xa0s\xa0q\x86ohttp://crl-us-east-2-aws-nitro-enclaves.s3.us-east-2.amazonaws.com/crl/e6bf6be2-5873-418b-9c28-004f65b7da1b.crl0\n\x06\x08*\x86H\xce=\x04\x03\x03\x03i\x000f\x021\x00\xb2\x9f\x85\x06\xcd@U|\x83\xe3\x1e\xbe\x13\xfa\xf4">\x80\xbb\xaa\xb8\xc2rO\x19I\xb0\xfb\x97\x87\x82\xf7\x1ee\\\xde\x93Z\x9c\x97D\xdf.\x96>\x1d\xeb\x94\x021\x00\xeaVt$\xe4\x91\x07LG\xdd\xfdh\xc7uh\x89\xa3?+\xee\xaf\x05FO\xd8\xd7\xbf\xb1\xdai\x045\x87f\xc5\xff\xcd\xfa\xf7\x1b\xc74\xa2$\xca\x02\x86\xfc',
  b'0\x82\x02\x7f0\x82\x02\x04\xa0\x03\x02\x01\x02\x02\x14;\xd9U7\xad\xcc\x94\xb5\xd1w\xea\x8f\x04\xae\x13Y\xb3\x11\xab\xec0\n\x06\x08*\x86H\xce=\x04\x03\x030\x81\x891<0:\x06\x03U\x04\x03\x0c333d4c88459a338f1.zonal.us-east-2.aws.nitro-enclaves1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x0b0\t\x06\x03U\x04\x08\x0c\x02WA1\x100\x0e\x06\x03U\x04\x07\x0c\x07Seattle0\x1e\x17\r210812222850Z\x17\r210813222850Z0\x81\x8e1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x0c\nWashington1\x100\x0e\x06\x03U\x04\x07\x0c\x07Seattle1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1907\x06\x03U\x04\x03\x0c0i-0685ead7f58d20e1d.us-east-2.aws.nitro-enclaves0v0\x10\x06\x07*\x86H\xce=\x02\x01\x06\x05+\x81\x04\x00"\x03b\x00\x04\xa7\xc8RHh\x95c\xee>>\xcd\xecq\x9d\xb5\xaf\xd69\x17\xae\x91\x05\xd3j\xb1\xb5\xb6\x9e\xc4>\x12\x07\x1d\xc6\xde\x89\xa90\xb2i\xde\xef\x16\xfb\x1d\xed\x84b\x94\xf6\xa0w\x11\xe0\xf3!\x8b\x80?G:9\xc1|J.]/{\x97n\x16v\xa3\x96F\xe05\xba\xee\xcbq\xdf\xb9\x04Bp\xf5\x00U:\xc5\xdb\xebk\x03\xa3&0$0\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\x000\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x02\x040\n\x06\x08*\x86H\xce=\x04\x03\x03\x03i\x000f\x021\x00\xc3\xae\x18\xb2\xdf\xf0cY)\xa0\xcd\xb7\xbcWa\x97\xc4!\xff\xd9E\x93\xc2\x1f\xf7j\xfa\xd3v\x1aV\xf4\xef\xb3\xa4\x107\x0b*Ez\x1f\xf1~\xb7\x8c\xc3\xc4\x021\x00\xe8qW*\x05\x9c&\x04m\xc1\x84]\x88\xba\x88>\x9c\x95>\xb4 2$\x16\x8c\x00$)\xa6@\xc1{r*so\x15q\x88>O\xb2\xad\x14\x978=\xb3'],
 'certificate': b'0\x82\x02{0\x82\x02\x01\xa0\x03\x02\x01\x02\x02\x10\x01{=\nr\x01\r\xd2\x00\x00\x00\x00a\x15\xc5X0\n\x06\x08*\x86H\xce=\x04\x03\x030\x81\x8e1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x0c\nWashington1\x100\x0e\x06\x03U\x04\x07\x0c\x07Seattle1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1907\x06\x03U\x04\x03\x0c0i-0685ead7f58d20e1d.us-east-2.aws.nitro-enclaves0\x1e\x17\r210813010528Z\x17\r210813040528Z0\x81\x931\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x0c\nWashington1\x100\x0e\x06\x03U\x04\x07\x0c\x07Seattle1\x0f0\r\x06\x03U\x04\n\x0c\x06Amazon1\x0c0\n\x06\x03U\x04\x0b\x0c\x03AWS1>0<\x06\x03U\x04\x03\x0c5i-0685ead7f58d20e1d-enc017b3d0a72010dd2.us-east-2.aws0v0\x10\x06\x07*\x86H\xce=\x02\x01\x06\x05+\x81\x04\x00"\x03b\x00\x04u\xd8\xfd\x8c\xe5\x97\xd7G\xb8\xd2\xa5"z\xcb\xec\x95/\x91E\xc9\x864\xffrK\xceTKwYWe\x9b\xa3\xf7\xb8-\xf6\xfb\xad\xa4\x15}\xf4\x92\x14\x96=\x96b\x95k?u\xf8!\x0fa\xb7\xa1\xa7\x0f\xc7\xde\xa8\xb0\xb0\xbc\xfc\\\xcc\x18\xbf\xe1\xb5{\xba\x06"\xa52\x1d\xe8\xae\xb5@\xb1\xfc\xf1\x01M\xc7\xf2L\x83=\xa3\x1d0\x1b0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x020\x000\x0b\x06\x03U\x1d\x0f\x04\x04\x03\x02\x06\xc00\n\x06\x08*\x86H\xce=\x04\x03\x03\x03h\x000e\x021\x00\xaco\xff\x06+\xef\x1ai4_\xd9$\xec\x96HZ\xd3P/\x0ex\xa9\xe5\x04\x91\x18\xd4Z\x07\xf4tz\x96\x95:a\xd9Yy6,\xab\x10H\xb8S\xa6"\x020[\xd8/M\x85\xb6vK\x98\x02\xe33\x06hj\n.ch\xc4\x8e\x17~+\xe5\xbd\xbdR\'\x87\x86\x8c\x80\x87\xf5\xfebB\x0eX\x95\xa4\xf9\x93\x86"\x14\x89',
 'digest': 'SHA384',
 'module_id': 'i-0685ead7f58d20e1d-enc017b3d0a72010dd2',
 'nonce': None,
 'pcrs': {0: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  1: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  2: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  3: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  4: b'\x88<\xba\xae\xecW\xd1\xc7\x84d\x02\x1cS\xfbx3\xf8\x02\xf7\xfa7\xca\x1e\x90\xdfi\xef:`\x08tCZ\xbd#\xf0\xa7/\xf2\x10\xe3\xacB;\xfb\xefO\xd2',
  5: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  6: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  7: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  8: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  9: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  10: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  11: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  12: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  13: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  14: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
  15: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'},
 'public_key': b'-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE3/sH0SC/O1IvkIz25BYCrQmtkfNR4te4\nfYXRL14tPLNjVuE8xxXpL84CxS2ostG3rvs7T656bU77ZWmZwkuAug==\n-----END PUBLIC KEY-----\n',
 'timestamp': 1628816728491,
 'user_data': b'more stuff'}

This must be a bug, right? The nitro-cli build-enclave --docker-uri ${DOCKER_IMAGE_NAME} --output-file ${EIF_FILE} command outputs correct PCR0-PCR2 values upon completion.

Below is the Rust code executing the request:

use nsm_io::Request;
use serde_bytes::ByteBuf;
use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    let nsm_fd = nsm_driver::nsm_init();

    let public_key = ByteBuf::from(args[1].as_bytes());
    let user_data = ByteBuf::from(args[2].as_bytes());

    let request = Request::Attestation {
        public_key: Some(public_key),
        user_data: Some(user_data),
        nonce: None,
    };

    let response = nsm_driver::nsm_process_request(nsm_fd, request);
    println!("{:?}", response);

    nsm_driver::nsm_exit(nsm_fd);
}
petreeftime commented 3 years ago

In debug mode, PCRs that are related to the image (0, 1, 2 and 8) are set to zero, to protect data that should only be accesible in production mode.

Jonas-Metzger commented 3 years ago

Interesting, thanks for clarifying! Makes sense, anyone seeing nonzero PCRs can be assured that the enclave runs in non-debug mode. What I still wonder is which security concerns the debug mode introduces. Is there a general explainer of the differences between debug and production mode that I should be aware of?