发新话题
打印

蔡学镛:别让你的程序代码布满弱点

蔡学镛:别让你的程序代码布满弱点

有一个常听到的笑话:如何保全(Secure)你的计算机不被入侵?答案是:关掉电源,拔掉所有线路,用水泥将它密封,然后丢进大海。尽管这种做法确实保障了计算机的安全,但也造成计算机完全无法运作,所以没有意义。
计算机安全(Security)分为两部分:(1)计算机保护自己免于外来危害或损失,同时系统必须维持原来的功能;(2)计算机安全必须和计算机功用之间达到平衡。后者才是真正困难的地方。
如果我们所需的安全系统技术相当难以使用、扰乱系统基本工作,那么用户就会将它关闭或略过,导致系统没有被安全。Windows VistaUACUser Access Control,使用者访问控制)正是这样的例子,许多人对于一再出现的安全提示感到不耐,于是关闭该功能,造成计算机处于无安全状态。
计算机安全不等于加密。安全虽然使用到加密,然而,密码学是另一个专业领域。除非你是这方面专家,否则你不应该写自己的加解密程序代码,即使专家也不见得能做好。.NETWindowsJava等平台都有完善的安全机制和工具,在这些平台上编写程序,便可以直接利用这些平台建立安全系统。
许多系统的安全都是事后加上,这样子很危险。事先良好的规画是建立安全环境的关键,而规画的最佳工具是安全塑模(Modeling)。
模型是系统的一种简化表现,将不必要和不重要的细节摒除在外。藉由塑造模型(Modeling),我们可以将焦点放在「真正有影响」的细节,忽略不重要的部分,因为现代计算机系统太过复杂,所以我们不可能巨细靡遗地处理所有细节,我们必须将焦点放在真正最重要的事情上。
威胁塑模是一种系统性的方法,可以辨识一个系统会遭遇哪些威胁,并归类之。对于系统的威胁,是指「潜在的事件,可能会具有不愉快或不想要的后果」。弱点则是指「系统设计上或实践上」的弱点,可能会被利用来造成这些不想要的事件。而攻击则是有人利用这些弱点来获取不被允许的利益。
模型的重点是用形式上的作法,寻找威胁与弱点,藉以破除攻击。这很重要,因为不这样做,我们可能会花上许多无谓的时间,试图保护系统免于不重要的事。不能在作法上聚焦,往往只得到无用的结果。

STRIDE
是相当知名的威胁分类模型。STRIDE可以针对系统的重大威胁进行分类。威胁正是攻击者希望发生的事,相对而言,也就是我们不希望发生的事。如果我们塑模所有的STRIDE威胁分类,我们就有很高的机会可以涵盖大多数重要的领域。

STRIDE
Spoofing(伪造)、Tampering(窜改)、Repudiation(否认)、Information Disclosure(信息揭露)、Denial of Service(服务阻断)、与Elevation of Privilege(特权提升)的缩写,分别解说如下:

伪造身分:在工作期间假冒另一个使用者的身分

窜改数据:就只是改变数据,窜改数据不见得是信息揭露,窜改数据只有达到数据的污损。

否认:就攻击者的观点,否认就是隐匿踪迹,让某件行为无法被追踪,无法归咎于肇事者。

信息揭露:允许未授权的人取用敏感信息,像是信用卡号码、密码……等。

服务阻断(DOS):让某种资源耗竭,例如网络带宽、处理器运算能力、磁盘空间。DOS攻击相当容易匿名发动,所以有时候会难以判断是否为恶意攻击。

特权提升:不具有特权的使用者或行程,获得特权的存取。
建立安全模型,有三个部分:威胁、资产与缓解(Mitigation)。资产是攻击者发动攻击的动机所在,这些资产可能是具有直接价值的东西,例如信用卡号码或财务信息;或者具有间接价值,像是「执行程序代码的能力」。执行程序代码的能力也算是资产,因为一旦可以在一部机器上执行程序代码,就可以使用这些资源来做些事情,例如送出垃圾邮件,执行分布式DOS攻击。
缓解是我们用来消弭威胁的手段。辞典对于缓解的定义是「使其变得较不严重」。将消弭威胁的手段定义为缓解,而非防止(Prevent),是因为我们可能不希望该活动被禁止,而是希望消除其中的伤害。比方说,在PowerShell中,执行程序的能力不能被防止,因为「执行程序」本来就是PowerShell存在的目的。我们只想让有授权的使用者才能执行被认可过的剧本,一旦有未授权的剧本执行,则会藉由许多不同的作法而被缓解。
身为程序员的你,必须及早补充Security相关知识,透过塑模了解系统可能面临的威胁,并缓解问题,保护资产。不要让你的程序布满弱点,危害大众。
蔡学镛-技术顾问
清华大学资讯工程硕士,曾任华硕集团软件工程师、元智大学信息系讲师、美商欧莱礼出版社技术编辑、台湾微软特约专栏作家

TOP

发新话题