最近看到一条新闻,某8岁小学生通过快速点击智能音箱的锁屏界面造成锁屏程序崩溃,攻破了家长给智能音箱设置的童锁。今年的一月份还有条类似的新闻,某个程序员亲眼看到自己的孩子在电脑键盘和屏幕上一通乱按后,搞崩了屏幕保护程序,黑进了他原本锁定的Linux X11桌面。二者都表现为这两个产品在访问授权的系统设计上存在明显的漏洞。
我们先从技术角度讨论一下这些漏洞的成因。很显然,智能音箱的新闻中,音箱厂家将童锁的安全性完全交由锁屏程序负责,自然是锁屏程序一旦失效,童锁的访问授权控制就一同失效。Linux X11桌面的新闻,也有类似的成因。屏幕保护程序肩负了桌面访问授权的责任,设计不良的屏幕保护在崩溃退出时也等效为给桌面访问授权。根据git issues上的信息,这个漏洞还还牵出Linux X11桌面访问授权的许多陈年设计缺陷的讨论。比如,X11服务没有做到屏幕保护程序在系统特权上的屏蔽,导致可以通过内存溢出攻击提权后非法授予桌面访问权限,等等。从这些漏洞的成因上,我们至少可以总结出三条设计经验:
- 诸如安全等关键的系统功能,应当设计为能够独立运作的系统机制,而不应该依赖其他外部程序;
- 系统关键功能的使能必须由明确的状态来控制,也就是说应当屏蔽任何不确定性状态对系统关键功能稳定性的干扰;
- 系统关键功能的权限,必须是实现对应功能的系统模块所自有的,不应该直接或间接授权给其他程序。
过多的独立的经验既会增加设计人员的记忆负担,也不易用于指导精巧高效系统的设计工作。所以,我们还需要对总结出来的经验进行归纳提炼,形成设计原则。
上述关于访问授权漏洞总结出来的经验,可以归纳提炼出的原则是:系统的缺省状态应该总让系统保持稳定。这一原则契合了道家“无为而治”的哲学。
很多人觉得“无为”是不作为,是一种消极的态度。其实真正意义上的“无为”是指不要逆自然规律去作为,不要代替自然规律去作为。自然规律是天道,是从自然系统整体的角度维持自然界存续的规则。不仅是违背自然规律的作为会带来不良的后果。任何以个体意志去代替自然规律作为,也会因为个体认知的不足,大概率导致对自然系统的损害,进而反过来损害个体。所以道家相信“无为”才能“治”。
类比而言:如果我们希望系统之下的任何程序的运行和消亡都不会影响系统的稳定,就是系统之下的任何程序不代替系统保持系统稳定。那么系统之下的任何程序是“无为”的,系统的各项机制应当足以保证自己的稳定性。系统的各项机制是系统设计而来就自带的,也就是系统缺省的。所以系统的缺省状态应当总让系统保持稳定。同样的,系统下的程序总在按照其自有的功能目标在运行,也可能因为各种设定的目的或异常而消亡,其状态在系统视角就是不具确定的。系统不应该让这些不确定的状态影响到自身的稳定。这也就要求了系统下的程序必须“无为”,不仅“无为”连“有为”的权限都不应该授予它们。同时,系统必须在没有明确的改变意图时维持住自身当前达到的稳定状态。
由此可知,“系统的缺省状态应该总让系统保持稳定”是“无为而治”的道家哲学的具体应用,是保障系统健壮性的一种设计原则。