什么是Stuxnet?
Stuxnet本质上是一种计算机病毒,但它是一种技术非常尖端的病毒。大多数病毒都通过电子邮件、文件附件或USB存储器传播,利用现代PC操作系统的弱点和漏洞产生破坏。这些病毒传播非常快,但处理电子邮件、互联网下载的许多常识性方法以及防病毒软件可帮助减轻其威胁。一般的计算机病毒都不分青红皂白:它们攻击接触到的每台计算机。Stuxnet则不同——传播方式与其它病毒类似,但对大多数系统没有影响。Stuxnet设计用于:
1. 通过典型的病毒传播途径入侵计算机。USB存储器是非常有效的传播途径。
2. 判断主机的位置是否处于伊朗。
3. 确认是否有特定类型的可编程逻辑控制器(PLC)连接至PC。
4. 检查是否连接了指定数量的此类PLC。
5. 确认这些PLC是否以非常特定的布置连接,并且控制特定的设备。
6. 重新编程PLC,改变其行为,但报告诊断表明一切正常。
这听起来相当复杂,但这只是冰山一角。Stuxnet针对的PLC数量及其配置证明:病毒的目的非常明确,就是攻击伊朗境内的特定核设施,并且逐渐、永久地破坏离心机,拖延伊朗的铀浓缩计划。破坏计划随时间推移逐步完成,以迷惑运营者——在深入挖掘以诊断问题之前,他们不会想到存在病毒或任何类型的IT问题。
证据表明Stuxnet成功破坏了伊朗核设施内的1,000台离心机。有猜测怀疑该病毒是由美国或以色列设计,或两国联合设计的。注意,Stuxnet实际上并不破坏受感染的大多数系统——攻击非常精准。这就使其能够在被检测到之前以及防病毒公司报告其存在之前,传播至其目标。
为什么我们需要警惕?
我们担心的原因有很多。这是一种高效网络战模型,可能已经启迪了全球各个国家的IT工作。既然美国/以色列在这一轮开场攻势中可能已经达到其目的,那么针对美国或其他盟国利益的报复性攻击的潘多拉盒子是否已经打开?是否会攻击西方的Stuxnet模型,将目的扩大为对关键性设施造成最大程度的破坏?
还有一个原因需要警惕:Stuxnet证明关键性设施没有保护措施。许多应用程序的设计往往不考虑安全因素,包括工业控制领域。关于在应用中设计安全因素,有一个基本规则:永远不会发生这种情况,因为这是个好点子。只有在以下情况下才会发生:(1)形势所逼(例如要求安全等级的认证);(2)公众的反应或破坏所暴露的安全缺陷。注意,第一种原因为先发制人,第二种原因是被动措施。我们现在处于哪种情况呢?
在后Stuxnet时代,我们是否问过自己这个问题并试图解决这一难题?有些人在问:“我们如何战胜Stuxnet?”,以及“我们如何保证USB存储器的安全?”从这些问题出发所形成的解决方案类似与绷带,就像机场安检要求我们脱鞋检查炸弹一样。没错,检查我们的鞋子能够检测到几乎有效的攻击,但并不能检查出新型的攻击。即使我们认为USB存储器是薄弱的并且是病毒传播途径,但安全的USB存储器无济于事——生产一种看起来安全却携带病毒的USB存储器并非难事。
问题根源
在鞋子炸弹的例子中,很容易识别问题根源:我们如何保证登机人(即乘客、维护人员、机组人员)的本意是旅行、维护飞机或操控飞机?确定问题并不困难,但获得答案却不容易。
Stuxnet也类似。问题应该是“我们如何保护关键基础设施才能使其正常运转?”答案比较复杂,究其根本是需要嵌入式系统的各个设计方面都考虑安全事项。工程师设计系统时通常首先设计基本功能,如果要考虑安全的话,往往被认为是随后添加的东西,应用至现有及设计好的系统。安全行业内的每个人都非常熟悉这句话:“随后将设计安全方面”,这实际上意味着解决方案永远不会安全。随后增加的安全只能流于表面,只能预防显而易见的威胁。
我们以另一种设备作为例子:智能电表最早设计用于满足计量精度要求以及正确实现通信栈。在通信栈中,通常采用高级加密标准(AES),以保护电表产生并发送回电力公司的数据,以及保护从电力公司发送至电表的命令。许多电力公司、通信服务提供商及电表制造商都宣称电表是安全的,因为电表采用了AES方法对进、出仪表的数据进行加密。但这是一条绷带——认为威胁仅仅是“篡改电表发出的数据和发送至电表的命令”。这就相当于在机场安检处脱掉我们的鞋子——判断出我们的单项威胁,然后利用单条绷带解决这个单项威胁。没有考虑下一项新威胁。在电表例子中,下一个更聪明的威胁可能是针对物理电表本身——攻击者是否能够入侵物理电表并将新应用程序装载至固件,使攻击者能够控制电表?现在,我们有了新的威胁——恶意的固件编程者。我们是开发另一条绷带呢还是考虑防止威胁的普适方法?
普适方法
绷带无济于事,它只能防止过去的攻击。我们对手的聪明程度足以转向新伎俩,但我们的安全方法却不能。如今的恐怖分子会在鞋子里装一个炸弹来登机吗?恐怕不会。他们会制定一种更具创造力的攻击方法——也许他们能够在非常小的机场逃过安检,然后乘私人飞机到达较大机场,从那里攻击较大的目标。
普适的安全方法要求对当前嵌入式系统的设计方法进行一些根本的改变。可能要求满足有些行业的技术规范或安全要求。然而,在智能电表及大多数工业应用中,我们发现没有依据可循,使工程师无所适从。这种情况下,工程师及产品定义应在安全方面采用更基本的方法:
1. 安全是定义产品之前的一项关键目标。在产品设计的概念阶段必须对威胁进行评估,选择元件时考虑安全因素。
2. 安全产品必须考虑终生的安全。这意味着控制和验证制造过程,使渗透攻击者不能提供自己的固件或生产自己的电路板来代替本来的产品。
3. 固件/软件和通信需值得信赖。要想信任某些东西,您需要对其进行验证。所以在加载运行操作系统和应用程序之前,必须对其加密验证,确认可靠。执行命令之前(比如“将该用户从电网上断开”),必须对命令进行加密验证。这就产生了关于权限的一系列问题——谁拥有向设备加载新应用程序或向其发送命令的权限?
4. 设计安全产品的过程不应是封闭过程。这看起来好像是矛盾的,但与业内或学术安全顾问配合,有助于发现系统中的威胁以及实现过程中的问题。即使在缺乏相关标准的领域,安全顾问或第三方安全评估也会有助于威胁的总体评估。闭门造车式的安全设计存在一个问题:其安全程度只能防范设计者本身!
5. 避免通过隐匿来实现安全。安全技术和算法不应寄希望于关于算法或方案的资料不公开。最好的技术实际上并不依赖于算法或保护机制的保密性。例如,许多工程师相信采用跳频方法的通信机制是安全的,因为“跳”使得攻击者难以锁定当前的有效频率并破译通信(即承载数据的频率理论上是隐藏的)。事实是,跳频在一定程度上必须具有确定性(否则另一侧就不能预测跳频),因此可被攻击者捕获。
一种常见的错误思想是认为完全保证嵌入式系统安全的技术根本不存在。这绝对是错误的——金融终端行业和许多政府应用多年以来一直依据安全标准制造设备。处理器可嵌入从简单(仅有AES引擎)到复杂(实数熵产生、非对称加密模运算加速、篡改检测、环境监测、扰码或加密等等)的安全技术。美国国家标准与技术研究院(NIST)在NISTIR 7816中指出,诸如实数熵产生和非对称加密等技术在嵌入式系统中非常困难1。现在,您打开任何金融终端都会看到有此类技术存在。
实现完美的安全性
如果我们遵循以上方法(以安全为己任、保证生命周期安全、验证输入、咨询外部专家,并避免通过隐匿实现安全),是否可实现完美的安全?非也。实际上,永远也达不到完美的安全。越接近完美安全,弥补漏洞所需的代价也成指数增长。安全设计就是威胁、风险以及预防这些威胁所需代价之间的平衡游戏。有效采用以上所列的方法,毫无疑问有助于弥补安全漏洞,从而更接近“完美安全”。如果受到Stuxnet攻击的PLC设备对其新应用程序代码进行加密验证,就不可能存在攻击途径。Stuxnet凶手就需要考虑其它途径——可能试图通过社会工程途径获取根密码(在早期设计阶段判断的更多的威胁!)。
嵌入式安全也仅仅是一个方面。整个系统都必须采用安全模式。然而,当今工业控制系统中最缺乏的是嵌入式安全。采用上述方法提高嵌入式系统安全仅有助于提高端点安全的状态——当今关键基础设施中最关键的缺陷。