在学习这节之前要给TTool装配好ProVerif,具体是在TTool/bin/config_*.xml
,这里*
是linux
或者macos
或者windows
,在里面配置下面的标签。
<ProVerifCodeDirectory data="../proverif/" />
<ProVerifVerifierPath data="../../proverif/proverif.exe" />
<ProVerifVerifierHost data="localhost" />
分别是ProVerif生成的形式化规约文件存放的目录、可执行文件路径、所在主机。第一个其实默认就是在TTool安装目录下的所以不用改,第三个两个都装在本机上也不用改,就改第二个就行了。
对抗策略就是解决威胁(如攻击树上的某个攻击)用的,这里是讲那些破坏信息安全性质的威胁,如何来实现避免这些威胁的对抗策略。
在上节的4
中的架构和映射视图下,工具里点Syntax analysis
检查无误,然后点Security verification (TTool)
打开信息安全性质验证窗口,然后点Start
进行验证(这个UI做的不好,如果屏幕不够大看不到底下的Result
,而且没法拖拽上来,这里截的是手册里的图):
结果中两条Reachable states
表明T1
和T2
的状态机里这两个状态(一个是往通道里写的操作,一个是从通道里读的操作)是可达的,这说明这个通道是能正常工作的,因为这个通信过程能正常发生。
一条Non confidential Data
表明这个保密性质不满足,说明通道不是保密的。在这条上右键,选择Show trace
可以看到给出的反例路径,即攻击者直接获取了T1
发的消息:
因为这个机密性不满足,在功能模型里可以看到表示去验证机密性的锁头标红了。
这是使用安全的架构得到的SecureArchitectureWithNonSecureFV
,即安全的架构在不安全的功能视图上,它将连接两个CPU的总线设置为private
,这样会在上面出现了一个绿色的盾牌标识。
用1.1
中的方法重新验证,可以发现保密性是满足的。即验证结果中会把性质放在Confidential Data
里面。
这是使用安全的功能得到的NonSecureArchitectureWithSecureFV
,即不安全的架构在安全的功能视图上,这里相比最开始的模型,只是修改了功能视图中的状态机。
在T1
的从通道发送消息前加入了一个加密块,在T2
的从通道接收消息后加入了一个解密块。在加密块上双击就能打开如下面所示的编辑窗口,其中更可以选择保证信息安全的模式,有Symmetric Encryption
、Asymmetric Encryption
、MAC
、Hash
、Nonce
、Advanced
。然后可以指定加密和解密所带来的计算复杂性,这个东西就会影响整个系统的性能。然后可以选择加密密钥和使用的内置算法,算法包括AES
、Triple-DES
、RSA
、ECC
、SHA-256
、Whirlpool
、Poly-1305
、HMAC
。
在收发消息的信号上就可以选择定义好的安全模式,比如下图就是选择了刚刚的Cipherdata
。这里要注意TTool的UI有个非常垃圾的地方,就是一个东西值设置好了,再打开编辑窗体之后下拉框里显示的不是当前值,就比如下图中的Attacker
,打开窗体永远默认值是显示Yes
,但是实际上当前值是No
,否则状态机的这个地方就会显示一个Attack
字样。所以TTool的编辑窗体UI里总是在下拉框下面放了个文本框,这个东西非常让人迷惑,竟然是用来表示当前值的意思。
再用1.1
中的方法进行验证,这个模型的机密性也是满足的。
但是因为这种方式是用加密来实现的保密性,所以加解密的代价会影响整个系统的性能。不考虑具体的硬件实现带来的影响(比如缓存未命中、任务切换、启动时间)TTool可以用DIPLODOCUS模拟器对系统进行模拟,然后就能看到一个CPU和总线使用的甘特图,这里手册没有展开说明。
给出安全需求,TTool就能在不满足这个需求的模型上添加相关的操作元素,或者是添加硬件安全模块(HSM),使模型满足安全需求。首先要将要满足安全性的通道标记上Confidentiality或者Authenticity。
先找到上一节里的最原始的不安全的模型,然后双击通道的端口,把Check Authenticity
勾上,不勾选Check Confidentiality
,也就是用ProVerif验证时候只验证认证性质,不验证保密性,如果是做添加安全操作,就会尝试添加认证性质。
先Check一下语法,然后点开ProVerif验证窗口,选到Automated Security
选项卡,勾选上Add security
,然后选上弱的Authenticity性质,如下图。
在这里还可以修改一下性能参数,即加解密操作带来的复杂度提升是多少。点击Start
,就会自动在功能视图的T1
和T2
的状态机里生成安全操作,来保证弱认证性。
还是用这个不安全的模型,不过这次给通道勾选的是保密性,在自动安全的窗口选中Add HSM
,这个选项和Add security
是互斥的,然后注意要把要添加HSM的控件选到右边去,如下图。
点击Start
可以看到为T1
和T2
分别生成了HSM,如下图。
模块T1
和它的硬件安全模块HSM_CPU1
如下图,结合上面的模块连线可以知道,一开始就是发个启动信号过去,然后HSM启动,所有要交换的信息都发给HSM,然后HSM加密之后再返回来,这个信息就是加密过的了。
如果是多个任务映射到一个CPU上,那么只会为中一个CPU生成一个HSM模块,而不会生成多个了。对于这个例子是生成两个,得到架构图如下,底下到两个新BUS的连线是手画的,因为手册里没画出来,但是实际操作TTool里是有这四根线的,反倒是两个CPU模块在TTool里显示不出来。
TTool在做自动安全生成的时候得到的排版非常混乱,基本上都是在一个位置生成,然后线也都直接连到某个位置,需要用户手动拖拽才能看清结构。
因为设置了多种密码学配置,所以把密钥映射到内存会比较麻烦,TTool可以根据这些配置来自动映射。对于对称加密和MAC(消息认证码),发送方和接收方都需要能访问到密钥。对于非对称加密,发送方要能访问到公钥(用于加密),接收方要能访问到私钥(用于解密)。
在获取密钥的过程中,如果密钥沿着公共的Bus发送,就会被攻击者窃取。在自动映射密钥到内存的算法中,会去宽度优先遍历所有的私有总线(Private Bus)和桥(Bridge),然后找到一个内存把密钥映射进去。
下面这张图是手册里的,但是我在TTool工具里没有复现出来。这个图可以去解释上面的说明,就是因为MainBus是共有的,Bus1和Bus2是私有的(可以看到绿色盾牌),所以两个密钥放在这两个私有Bus所连接的内存里。
软件(或者协议)设计包含一个Block Diagram和每个任务块的状态机,下图有一个主块System
和两个子块(cryptoblock
就是带了内置的加解密签名算法和消息拼接拆分操作)T1
和T2
。
在主块上连接了一根传消息的线,双击编辑可以看到里面的输入输出信号的配对关系。
在写规约语言的框里可以看到sk
是对系统内的所有会话共享一次,要验证的保密性是T1
的secretData
。
这两个块的状态机如下,就是T1
把保密信息secretData
装到要发的消息m
里,然后用sk
加密发出去,然后T2
接受到消息后用自己的sk
解密得到消息,然后将其中的数据域拿出来即获得了T1
的保密信息secretData
。