登录密码
- U-Boot登录密码 & Shell登录密码,必须够复杂,复杂程度可参考:https://suijimimashengcheng.bmcx.com/,比如:
xDvd&QaU@Dqhv0%1
。 - 可参考HIK芝麻开门功能,通过定制化的/bin/psh实现一机一密,只能通过官方途径提供的密钥来打开Debug功能,提升易用性。
U-Boot重要参数备份
比如bootcmd参数,防止通过修改init=/bin/sh的方式绕过密码登录。
bootcmd参数在制作设备固件时就可以确定下来了,并且同一款设备的bootcmd参数一般也不会改变,可将其作为设备的出厂配置写到配置文件中,系统启动后将当前的bootcmd和配置文件中的bootcmd作对比,如果不一致,就改回去并立刻重启,可有效解决bootcmd参数被篡改的问题。
Flash写保护
默认开启写保护功能,只在需要写入时临时解开写保护。
Flash分区校验
记录每个只读分区的校验,避免通过解压文件系统再重新打包烧录的方式破解固件。
对于单独存储校验的分区,可再进行加密保存,确保校验信息不被破解。
这一步是在U-Boot里做的,实现起来其实不难。
Flash分区加密
Flash存储的是加密分区,U-Boot/内核运行后先解密分区再加载运行,可有效防止固件被读取和解压,缺点是技术难度较高,需要修改内核代码,并且影响启动速度。
Linux系统可能已经提供了通用的解决方案,待确认。
bin文件反破解
主程序bin文件本身并没有多少反破解手段,毕竟用IDA Pro之类的工具可以直接阅读反汇编后的汇编代码执行流程,能做的就是加大反汇编后阅读的难度而已,比如strip符号表,或者使用更高级的编译优化选项。
千万不要笨到在发布程序里还带调试信息,这样别人用IDA Pro反编译一下,跟直接看源码没啥区别,比如:openhisilicon/HIVIEW。
串口打印及远程登录
- 默认禁用串口打印和Telnet登录,只能通过特殊方式开启。
- 即使打开串口打印和Telnet,也不要在日志或文件系统里暴露关键信息,比如可以对日志再进行等级设置,对关键文件进行加密。
- 可参考HIK芝麻开门功能,不关闭串口/Telnet,但一机一密,只能通过官方途径提供的密钥来打开Debug功能,提升易用性。
- 如有必要可将Telnet替换为SSH登录,进一步提升安全性。
设备加密
Flash设备加密信息处理:
- 保证加密够专业够复杂,不被破解。
- 一机一密,避免抄板和克隆设备。
- 对于没有加密信息的设备,统一认为是非法设备, 可以采取多种手段,比如不允许启动,或是启动后仅提供一个最低的设备能力(分辨率码率帧设到最低等),以及对于没有加密的设备,全部使用默认的MAC地址,这样也可以保证即使通过抄板的方式克隆了设备,也无法大批量生产。
- 也可采用外部加密芯片来存储设备加密信息,比如AT24C02。
端口监听
小心处理设备对外暴露的UDP/TCP端口,包括但不限于以下内容:
- 对于任何可扫描到的UDP/TCP端口,要禁得起非法数据攻击,不能出现通过发送非法数据把设备搞挂或是严重降低性能的情况。
- 仅对外开放必要的端口,比如HTTP, RTSP之类的知名端口,对于设备内部用于进程间通信的端口,必须绑定到127.0.0.1上,或是使用Unix本地套接字进行通信。这是很简单的一个步骤,但却能降低非常多的风险,因为这些进行间通信的接口往往都不会设计得很严谨,很容易暴露问题。
- 可借助知名的端口扫描&漏洞测试工具进行压测。
- 可借助iptables工具实现黑名单与白名单功能,比如屏蔽某些IP或只允许某些IP可以访问。
用户配置文件备份及加密
对于存储在设备上的用户配置文件,必须进行加密,以避免泄漏用户密码这种问题,同时应进行备份,避免断上电等异常行为导致主文件损坏后丢失用户配置。
某些产测相关的文件也可以遵从以上方法。
双系统备份
目的是防止升级过程异常中断导致设备变砖,可采取A/B分区乒乓升级的方式,或是大小系统的方式,小系统专门用于升级失败后从网络下载固件对主系统进行恢复。