1.1 错位的信任
软件程序往往包含多个组件作为子系统,其中每个组件会在一个或多个受信域中运行。例如,一个组件可以访问文件系统,但不允许访问网络,而另一组件可以访问网络,但不能访问文件系统。非信任解耦(distrustful decomposition)及权限分离(privilege separation) [Dougherty 2009]是安全设计模式的例子,它意味着首先需要减少需要授权的代码的数量,这就要在设计系统时,使用不互信的组件,并保证组件在特定的权限下运行。
当软件组件需要遵循安全策略时,可以允许它们跨越受信的边界来传输数据,对于任何一个组件,它们不能指定其自身的受信级别。受信的边界应该由应用程序的部署者来确定,要完成这件事情,则需要一个全系统级别的安全策略的帮助。安全审核员可以使用这样的安全定义,通过安全定义来确定该软件能否充分支持应用系统安全目标的实现。
一个Java程序可以包含自行开发和第三方开发的代码,Java被设计成允许执行非受信代码;因此,第三方代码可以运行在它自己的受信域中。可以认为使用公共的API接口的第三方代码已经处在受信边界之中。任何跨越受信边界的数据都应接受验证,除非产生这些数据的代码本身已经能够提供权限有效性的保证。一个用户或使用者可以在数据流入受信边界时,省略对数据的验证,当然前提是其受信边界是适当的。在所有其他的情况下,进入数据必须接受验证。