一个系统必须运行一块你无法控制的代码——一个插件,一个依赖,某种生成的东西——而你想要保证代码不能触摸文件系统或产物过程.
不是说它"不应该": 它不能,机械的。
这是能力限制, 这是运行时间安全的核心问题之一。
设计并演示是两种不同的事物,而混淆是昂贵的.
设计是索赔 你可以写一个无可挑剔的文档:"进入和进入产卵过程被这样控制,用这些机制,在这个威胁模型下".
这是真实和必要的工作.
却作是说.
而安全分界线的失败模式是,它看起来像是坚守到不——沉寂地,在测试中看不见,只有在有人越过它时才能看见——.
在安全方面,一个未经核实的主张完全具有一个美丽,错误的建筑形状.
设计可以假设一个模块装填器悬钩起火时实际上没有,所有的推理都挂出正确而无价值.
机制存在,在节点中有几个,来命名一个混凝土运行时间,至少有三层,它们不能互换: 原生许可模式(.),它在整个进程一级切断了进入和产卵过程的机会。
SES / 硬化JavaScript(Compartments, ),它限制了每个模块在进程内可以导入的内容.
模块装填器截取,它控制当代码要求某事时解决什么.
在其中选择好的是设计.
但是选择好并不能证明选择 与你将要运行的真正依赖性树相抗衡。
证明而不是索赔 除签署设计外,另一种办法是提供禁闭装置:不可信的密码,试图达到危险的能力——打开一个文件,产出一个过程——以对抗实时及其真正的依赖树,以及显示每次尝试的日志被屏蔽.
或者,如果有东西逃出,确切的位置。
区别不是化妆品 "我认为这是被限制的","有证据表明试图从被拒绝的插件返回许可读取一个系统文件",是具有非常不同重量的说法.
第二,我对安全的其他一切运用的纪律:跨越程序边界,测量出什么来,而不是你认为出什么来。
诚实的部分 有一种诱惑,就是从一个你没有挣到的权力机构那里签下边界——因为设计看起来不错,因为机制是存在的。
诚实的纪律正好相反:你今天可以回来的,你回来的;取决于运行时间细节的,你没有掌握,你没有从记忆中断言:你通过经验验证,而尚不能证明的,被标记为接合来共同审查,而不是隐藏.
已证明的边界完全覆盖了所声称的空白。
对于必须相信禁闭的人来说, 攻击自己边界和保存证据的绳子比设计它的人的言语更有价值.