一年前,写了个帖子https://whycan.com/t_6507.html在全志芯片F1C100S/V3S/V831上实现裸机加密方案,防盗版进行时(不采用专用加密芯片)。
用于解决防盗版问题,这种方案是保护整个产品。
但如果我们的诉求变化了,不是保护完整的产品,仅要保证客户必须从我这里采购芯片,即使客户不从我们这里采购芯片,也能运行,只不过有个恶心的“未授权”提示,体验功能不受任何影响,那么该如何实现呢。同样,不采用任何加密芯片(一个主芯片配一个加密芯片,这种算常规方案,不考虑)
归纳下:
1,要求客户必须从你这里买主芯片,如果是从其他渠道购买的,所有功能都是正常的,但有屏幕有恶心提示,或显示我司联系方式。
2,不采用加密芯片,
3,镜像或者源码可以提供给客户(部分闭源)。
离线
先解决恶心提示问题,这个比较简单,直接在窗口显示一陀东西,就行了,怎么恶心,怎么来,反正关不掉。
离线
那怎么判断这个芯片是不是你卖给他的呢,这里有多种组合方案。
1,SOC里有唯一ID,还有EFUSE
2,SOC里有唯一ID,没有EFUSE,但要求客户买你的SPI nor 或者EMMC
3,如果SOC没有唯一ID,没有EFUSE或者不购买SPI nor,EMMC等,这种情况直接pass,考虑加密芯片吧。
离线
先说思路,自己搞个ECC密钥对,保护好,杜绝泄漏。
先根据芯片的唯一ID,SHA256运算,再ECDSA签名,签名文件写入芯片的EFUSE,然后写好efuse的芯片,就可以直接出给客户了。
离线
如果没有efuse,就写到flash里,一起出给客户,但这种方案,必须保证主芯片和flash是配套的,但贴片时很难杜绝,这种情况,只能是等客户贴好板子了,给客户激活,或者网络直接激活。虽然有恶心的提升,但不影响使用,如果搞服务器的话,可以让客户自行激活,而且还可以计算数量。
离线
恶心提示的判断点是验签。
离线
有了这些机制,剩下的就是完整性保护,防止干掉恶心提示,这里就需要有部分代码是闭源的,且启动时需要检测是否修改过。这个可以用上可信引导技术。
离线
任何限制都仅仅是手段,让客户乖乖掏钱才是最终目的。
离线
这种方案,有个最大的好处是,客户随便刷机,也感受不到保护机制的存在,只有客户在心生邪念时,才会被教育。前期合作双方没有任何心理负担,彼此都很坦诚,可以有效维护客户关系。合作久了,心生邪念了,也能有效保护个人利益免受侵害。如果一开始就来个加密芯片,很守规则的客户估计心理要凉半截。得不偿失。
离线
信任跟共识一样,很有价值,但要做到是需要花费巨大的成本的。
离线
之前有个想法,
把一些函数(关键功能,认证等),不生成位置无关代码,但相同的入口地址, 再把这些函数使用非对称加密。
运行时,在调用这些函数前,使用密钥释放其到相对应的函数到入口地址处,再执行
离线
一开始想把引导程序签名进efuse然后验签,不过这个挡不住客户去用开源的引导程序)
不过我觉得除非ROM里有某种保证机制否则就比较难说了。除非芯片厂硬编码了或者efuse里预留了一组根证书进去,然后一级级签名,最后经销商签名之后程序才能跑,这才好说。我觉得操作系统内核以及以上的机制都不能解决这个问题,因为换内核、换tee这些路径只要理论上可行,在利益下就一定有人会去做。
然后就是防止伪造签名了,这点用一些生命周期里不会出问题的算法就可以。
离线
上面那层楼我没有说清楚,讲一讲(后续芯片代数开始)具体的实现方案。
总的思路是使用多级证书。多级证书就是经销商拥有一个证书,厂商也有一个证书。经销商的证书是芯片厂商签名过的,芯片厂商会在ROM代码里用私钥验证,保证经销商证书是不能造假的。然后有买家要买芯片的时候,它的引导程序必须被经销商证书签名,然后签名要放在引导程序的固件开头。那我怎么知道是哪个经销商签名的引导程序呢?把经销商的证书写进efuse代码里就可以了。经销商发给客户的芯片都是写好自己的经销商证书的,不能修改。芯片开机时,厂商的ROM代码会直接验证固件开头,保证引导程序是efuse里给定的证书签名的,而且efuse里的经销商证书也是厂商验证因此是真实的。如果客户要换引导程序或者升级引导程序怎么办呢?客户把新版引导程序发给经销商,经销商签名,然后客户把签名放在引导程序之前镜像的开头就可以了。
厂商私钥验证部分的ROM代码不能读,而且必须使用时长无关的指令去验证,防止各种侧信道偷ROM数据的做法。比如可以用RISC-V的K指令集。私钥验证的ROM代码可以和其它的ROM代码分开设计,私钥验证的ROM禁止读取,但其它部分的ROM代码开放性要尽量强,方便开源社区做引导程序来做芯片生态,其它部分的ROM代码仍然可以读。
为什么不用直接签名,而用多级证书呢?首先直接签名会把收到的芯片和某一个引导程序捆绑。如果芯片买家要更新引导程序版本(修bug等等)或换自己的引导程序(实现TEE、软调试内核或特殊需求等等),即使你仍然用同一个密钥给它签名,得到的签名是不同的,它这批买的芯片就废了。如果换一个密钥给它签名,直接签名的方法就得换一批efuse的值才能达到换密钥的目的,买家就只能等下一批新签名的货到了才能用,然后如果又发现老版本的引导程序才是对的,又要换老efuse的芯片,这就子子孙孙无穷尽了,所以直接签名在商业上不是容易完成的做法。
落实到具体应用上,如果经销商担心自己的证书私钥泄露(不一定是通过芯片泄露的,也有可能是内鬼或者别的网络安全问题),可能会在上面的模型之后再增加一个证书级别。每个批次的经销商货源会使用一个证书,这样每给客户交付一批新的货,给客户的引导程序重新签名一次就可以了。如果证书私钥泄露了,最多导致这一批货的芯片可以被破解,而不会影响前序后续批次的所有产品。当产品序列结束现役(比如5年、10年时间等等),经销商可以把货源的私钥公开,允许开发者去hack这个批次的产品,进一步扩展经销商的销路。
当厂家交付开发用芯片时,efuse代码还没写入证书,也就是不需要签名引导程序就能运行。这时候开发者可以写进自己的证书,然后通过一个特殊的外设验证ROM签名是否成功,来作为开发时参照使用。芯片里”不能更改证书“的efuse位还是允许的。量产的芯片如果规定必须经过经销商,经销商再写入”不能更改证书“位来禁止更改证书,达到验证货源的目的。
最近编辑记录 洛佳 (2022-05-22 16:59:11)
离线
上层楼的做法代码可以完全提供给客户,不过它的机制是可以保证只有经销商签名的引导程序能用,不签名不能用。如果要进一步在屏幕上显示提示,这个因为是需要写代码(至少要操作屏幕的芯片外设)才能完成的功能,芯片里预留给经销商控制的代码有限。如果要专门增加一个经销商代码的flash,就有点增加芯片成本了。显示提示这种需求还得靠群友集思广益。
最近编辑记录 洛佳 (2022-05-22 17:05:55)
离线
多级信任链,是可取的,但整个游戏规则,必须由芯片原厂来设计,芯片原厂其实是没有太多动力做这件事的,反正你都是我的芯片,随便你哪个代理商,贸易商,方案商来出,都是一样的,还省得麻烦,现在主要是思考现行商业模式下,如何能达成此类需求,不做伤筋动骨的假设。
离线
@xboot
这个想法没错,只能是厂家首先提供了才能用,厂家不提供就没辙。现有的芯片也满足这个规律
离线