第八章 物联网安全防护
0x01 物联网各层防御措施讲解
1. 硬件层的防御措施
- 使用独特的螺丝钉或使用其他方法将硬件的各个部分组合
- 隐藏主控芯片引脚和型号信息
- 固件分离式存储
- 隐藏调试接口
- 防止侧信道攻击
2. 固件层的防御措施
2.1 为什么进行固件签名
攻击者在其他入侵系统尝试失败后可能利用的攻击媒介之一,是让系统拥有者安装更改过的应用、固件或者其他软件模块。修改后的软件可能包含具有特定用途的恶意代码。一个常见建议是不安装来源不完全信任的软件。
签名固件由软件供应商实施,它使用私钥(密码)来对固件映像进行签名。当固件附加有此签名时,设备将在安装前验证固件。如果设备侦测到固件完整性受损,固件升级将被拒绝。
2.2 固件加密
设备的安全性分析是 IoT 安全审计中非常重要的部分。获取固件是分析中的众多挑战之一,你可以通过多种技术来做到这一点。拥有固件后,就可以对其进行更仔细的分析。供应商已开始以加密的形式在服务器上存储固件,因此,即使你获取了固件,在进行进一步分析之前仍然需要对其进行解密。
2.3 固件混淆
- 代码混淆(obfuscation)是将计算机程序的代码,转换成功能上等价,但是难于阅读和理解的形式的行为。
- 代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称为代码混淆器。目前已经存在许多种功能各异的代码混淆器。
2.4 安全启动
- 在传输期间能够物理访问设备的攻击者可能会执行攻击,例如:降低设备的启动分区,从而绕过固件完整性检查,以便在部署设备之前安装已更改的恶意固件。
- 安全启动是一种由加密验证软件的完整(性)的链组成的引导过程,可从不可变的内存(引导ROM)开始。安全启动基于签名固件的使用,可确保设备仅能使用已授权的固件启动。
- 启动ROM验证启动程序时启动引导过程。安全引导,然后以实时的方式验证从山村中加载的每个固件块的嵌入式签名。启动ROM时信任的根,仅在验证每个签名时,才会继续执行启动过程。链的每个部分都验证下一部分,导致已验证的Linux内核和经验证的根文件系统。
2.5 TPM
- 传统上来讲,TPM是焊接到计算机主板的离散芯片。此类实现允许计算机的原始设备制造商(OEM)评估和认证独立于系统其他部分的TPM。尽管离散TPM实现仍然很常见,但他们对于较小或电源消耗低的集成设备可能有问题。某些较新的TPM实现将TPM功能集成到与其他平台组件相同的芯片集中,同时仍然提供类似于离散TPM芯片的逻辑分离。
- TPM是被动的:他们接收命令并返回相应。若要实现TPM的完整优势,OEM必须仔细地将系统硬件和固件与TPM集成,以向其发送命令,并对它的响应做出反应。
2.6 MCU
主要针对引导过程中的恶意代码
- 对于从外部SPI闪存启动的操作系统,Microchip技术引入了其最新的加密微控制器(MCU),以防止rootkit和bootkit恶意软件,从而实现了安全引导,硬件根信任保护。
- 使用硬件根信任的安全引导对于在系统中加载威胁之前保护系统免受威胁至关重要,并且只允许系统使用制造商信任的软件引导。
3. 嵌入式WEB的防御措施
3.1 及时升级更新固件
设备固件应即使检测新版本,老旧的固件存在漏洞的概率是很大的,如果厂商通知旧版固件存在安全隐患,更应该立即更新或安装补丁,防止被恶意利用。
固件开发人员应密切关注gohead lighttpd等webServer的漏洞发布并及时更新
3.2 对传递的数据转义
防xss是后端人员的责任,后端应该在所有用户提交数据的接口,对敏感特殊字符进行屏蔽或转义,才能进行下一步操作。
所有要插入到页面上的数据,都要通过一个敏感字符过滤函数的转义,过滤掉通用的敏感字符后,才可以插入到页面中。
3.3 不预留后门
Cisco、TP-Link、Netgear、Tenda、D-link等主流网络设备生产厂商的多款路由器产品,均存在远程命令执行,超级用户权限等预置后门。
虽然方便管理等其他用途,但是黑客可借此取得路由器的远程控制权,进而发起DNS劫持、窃取信息等攻击。
如果发现厂商预留后门,应立即检测固件升级,或限制网络访问。
4. 协议层的防御措施
4.1 wifi
- wifi开发使用最新版协议栈,ap 使用 wpa/wpa2 模式并且密码长度设置成16位以上,使用数字、字母、大小写、特殊符号混排形式。
- 在设置WIFI时,如果禁用”允许SSID广播”功能,也会增加WIFI的安全性,防止恶意链接攻击设备。
4.2 Zigbee
- Zigbee通信信任中心链接密钥不使用默认值
- 使用高级安全模式,预安装密钥
- 使用最新版本协议栈
4.3 BLE
- 通信连接不使用Just Work模式
- 发现通报漏洞及时给设备升级固件
- 在应用层对数据加密再进行传输
4.4 RFID&Mqtt
- 使用安全性更高的cpu卡
- 对卡内数据进行加密存储
- 及时对服务器内存储数据检查
- mqtt使用tls对数据加密通信
5.应用层的防御措施
5.1 签名验证
为了防止自己的应用被反编译后重新打包,可以采取运行时进行签名校验。PackageManager类中提供查看当前程序签名的方法。
1 | Signature[]=context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures |
5.2 应用加固
可以使用360 爱加密等服务商提供的加壳服务,或对应用内程序以及资源以及字符串混淆与加密。
5.3 SSL-Pinning
在开发时就服务端证书一块打包到客户端里。在HTTPS建立时与服务端返回的证书比对一致性,如果识别出中间人攻击后直接在客户端侧中止连接。
5.4 发布release版本
在应用发布时编译为release版本,debug版本数据包防止外流
1 | android:exported=false |