查看完整版本: 蔡学镛:别让你的程序代码布满弱点

佳佳象棋 2007-12-25 10:16

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

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

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

STRIDE[/size][font=宋体][size=11.5pt]是[/size][/font][size=11.5pt]Spoofing[/size][font=宋体][size=11.5pt](伪造)、[/size][/font][size=11.5pt]Tampering[/size][font=宋体][size=11.5pt](窜改)、[/size][/font][size=11.5pt]Repudiation[/size][font=宋体][size=11.5pt](否认)、[/size][/font][size=11.5pt]Information Disclosure[/size][font=宋体][size=11.5pt](信息揭露)、[/size][/font][size=11.5pt]Denial of Service[/size][font=宋体][size=11.5pt](服务阻断)、与[/size][/font][size=11.5pt]Elevation of Privilege[/size][font=宋体][size=11.5pt](特权提升)的缩写,分别解说如下:[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]●[/size][/font]
[font=宋体][size=11.5pt]伪造身分:在工作期间假冒另一个使用者的身分[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]●[/size][/font]
[font=宋体][size=11.5pt]窜改[b]数据[/b]:就只是改变数据,窜改数据不见得是信息揭露,窜改数据只有达到数据的污损。[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]●[/size][/font]
[font=宋体][size=11.5pt]否认:就攻击者的观点,否认就是隐匿踪迹,让某件行为无法被追踪,无法归咎于肇事者。[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]●[/size][/font]
[font=宋体][size=11.5pt]信息揭露:允许未授权的人取用敏感信息,像是信用卡号码、密码[/size][/font][size=11.5pt]……[/size][font=宋体][size=11.5pt]等。[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]●[/size][/font]
[font=宋体][size=11.5pt]服务阻断([/size][/font][size=11.5pt]DOS[/size][font=宋体][size=11.5pt]):让某种资源耗竭,例如网络带宽、处理器运算能力、磁盘空间。[/size][/font][size=11.5pt]DOS[/size][font=宋体][size=11.5pt]攻击相当容易匿名发动,所以有时候会难以判断是否为恶意攻击。[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]●[/size][/font]
[font=宋体][size=11.5pt]特权提升:不具有特权的使用者或行程,获得特权的存取。[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]建立安全模型,有三个部分:威胁、资产与缓解([/size][/font][size=11.5pt]Mitigation[/size][font=宋体][size=11.5pt])。资产是攻击者发动攻击的动机所在,这些资产可能是具有直接价值的东西,例如信用卡号码或财务信息;或者具有间接价值,像是「执行程序代码的能力」。执行程序代码的能力也算是资产,因为一旦可以在一部机器上执行程序代码,就可以使用这些资源来做些事情,例如送出垃圾邮件,执行分布式[/size][/font][size=11.5pt]DOS[/size][font=宋体][size=11.5pt]攻击。[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]缓解是我们用来消弭威胁的手段。辞典对于缓解的定义是「使其变得较不严重」。将消弭威胁的手段定义为缓解,而非防止([/size][/font][size=11.5pt]Prevent[/size][font=宋体][size=11.5pt]),是因为我们可能不希望该活动被禁止,而是希望消除其中的伤害。比方说,在[/size][/font][size=11.5pt]PowerShell[/size][font=宋体][size=11.5pt]中,执行程序的能力不能被防止,因为「执行程序」本来就是[/size][/font][size=11.5pt]PowerShell[/size][font=宋体][size=11.5pt]存在的目的。我们只想让有授权的使用者才能执行被认可过的剧本,一旦有未授权的剧本执行,则会藉由许多不同的作法而被缓解。[/size][/font][size=11.5pt]
[/size][font=宋体][size=11.5pt]身为程序员的你,必须及早补充[/size][/font][size=11.5pt]Security[/size][font=宋体][size=11.5pt]相关知识,透过塑模了解系统可能面临的威胁,并缓解问题,保护资产。不要让你的程序布满弱点,危害大众。[/size][/font][size=11.5pt]
[/size][b][font=宋体][size=11.5pt]蔡学镛-技术顾问[/size][/font][/b][size=11.5pt]
[/size][font=宋体][size=11.5pt]清华大学资讯[b]工程硕士[/b],曾任华硕集团[b]软件工程师[/b]、元智大学信息系讲师、美商欧莱礼出版社技术编辑、台湾微软特约专栏作家[/size][/font][/size][/font]
页: [1]
查看完整版本: 蔡学镛:别让你的程序代码布满弱点