《JFlow: Practical Mostly-Static Information Flow Control》
JFlow: 实用的多静态信息流控制
Proceedings of the 26th ACM Symposium on Principles of Programming Languages (POPL '99)
摘要
保护敏感数据的隐私和完整性的一项有前途的技术是静态检查操作数据的程序内的信息流。本文描述了一种新语言JFlow,它是 Java语言的扩展,添加了静态检查的信息流注释。JFlow的几个新特性:去中心化的标签模型、标签多态性、运行时标签检查和自动标签推理,支持的语言特性包括对象、子类化、动态类型测试、访问控制和异常。本文给出了用于检查JFlow程序正确性的形式规则。
导言
- 本文提出的工作目标是为静态检查框架增加足够的能力,以允许以自然的方式编写合理的程序。JFlow旨在支持处理敏感数据的安全服务器和小程序的编写。新标签结构的一个关键优势是它是去中心化的:它不要求系统中的所有其他主体信任主体p的解密决定,因为 p不能削弱它不为之行动的主体的策略。
- JFlow的功能:
✔ 支持许多语言特性包括对象、子类化、动态类型测试、访问控制和异常。
✔ 支持去中心化的标签模型(允许多个主体保护他们的隐私,即使存在相互不信任);支持安全的、静态检查的解密或降级(允许主体放松自己的隐私策略,而不削弱其他主体的策略)。
✔ 提供了一个简单但强大的访问控制模型,允许静态检查代码权限以及动态授予和检查权限。
✔ 提供了标签多态性,允许代码相对于它操作的数据的安全类是通用的。
✔ 当静态检查过于严格时,运行时标签检查和一级标签值提供了动态转义。
✔ 自动标签推理< /span>使得不用编写许多原本需要的注释。
✔ JFlow编译器的结构是一个源代码到源代码的翻译器,所以它的输出是一个标准的Java程序,可以被任何Java编译器编译。
1、语言概述
- 标签是一组策略,每个策略都有一个所有者O,这是一个主体;每个策略还有一组读者,它们是O允许观察其数据的主体。单个主体可能是多个策略的所有者,并且可能出现在多个读者集中。
- 标签L={o1:r1,r2;o2:r2,r3}中有两个策略(用分号分隔),分别归o1和o2所有。主体o1的策略允许r1和r2读取;主体o2的策略允许r2和r3读取。有效读者集仅包含公共读者r2。
- 限制最少的标签是{}标签,它不包含任何策略,数据是完全公开的。
- 主体可以选择放松其拥有的政策,这是一种安全的解密形式,因为所有其他数据策略仍然有效。
- 一些主体还被授权代表其他主体,从而创建主体层次结构。标签的含义受当前主体层次结构的影响,如果主体r2可以代表主体r1,那么如果r1被一个策略列为读者,那么 r2也被该策略有效地列为读者。
- 每个变量都静态绑定到一个静态标签。如果一个值v有标签L1,一个变量x有标签L2,那么只有时,才能给变量(x := v)赋值。
- 简写为A≈B
- 解密为严格的信息流跟踪提供了一个出口。如果一个进程的权限包括一个主体p,则可以通过删除p所代表的主体所拥有的策略来解密一个值。
2、标签类型
- 标签由标签表达式表示,标签表达式是一组组件表达式。组件表达式可能只是一个变量名,它表示该变量标签中的策略集。
◈ {a}标签包含单个组件,含义是它所标注的值应该像变量a一样受到限制。标签{a;o:r}包含两个部分,表示标记的值应该像a一样受限,并且主体o最多限制r读取的值。 - 在JFlow中,每个值都有一个由两部分组成的标记类型:一个普通的Java类型,如int,以及一个描述值可以传播的方式的标签。任何类型表达式t可以用任何标记表达式{l}来标记,记为t{l}。
◈ 标记为int{p:}的类型代表一个整数,主体p拥有该整数,并且只有p可以读取。 - 标签不是纯粹的静态实体,也可以用作值。
- 运行时标签增加的重要功能是能够在运行时使用Switch label语句进行检查。
3、授权和解密
- 在程序中的任何给定点上,编译器认定要运行的代码能够代表某组主体,则称代码在该点上静态权威。
- 程序可以使用它的权限来解密一个值。表达式declassify(e,L)用标签“L”来标记表达式e的结果。解密是静态检查的,在解密时使用静态权限。解密表达式可以放宽静态权限中主体所拥有的策略。
4、类
- 一个类可以通过在类头中添加一个authority子句来授予它的对象一些权限。authority子句可以命名程序外部的主体或主体参数。
◈ 如果authority子句命名外部主体,则将类安装到系统中的进程必须具有命名主体的权限。
◈ 如果authority子句命名作为类参数的主体,则创建类对象的代码必须拥有在对构造函数的调用中使用的实际主体参数的权限。
5、方法
- begin-label用于在调用方法时指定对pc(程序计数器)的任何限制;end-label指定通过观察该方法是否正常终止可以了解到什么信息
6、类型检查与标签检查
- JFlow编译器在编译程序时执行两种静态检查:类型检查和标签检查
- 静态检查一些最基本的规则:
◈ 一个文字表达式总是正常终止,并且它的值被标记为当前pc
◈ 空语句总是正常终止,与开始时的pc相同。
◈ 变量的值同时用变量的标签和当前的 pc 来标记
◈ 如果变量的标签比被赋值的值(包括当前的pc)的标签更严格,则允许赋值 - 单路径规则:如果一条语句(或一系列语句)只能正常终止,那么最后的pc和开始时的pc是一样的。如果语句只能以 return 语句结束,也是如此。
- 静态和非静态方法调用以及构造函数调用的检查都是用谓词call来表示的,call可以用call-begin和call-end表示。
◈ 谓词call-begin:检查参数表达式,并确定调用方法的约束得到满足
◈ 谓词call-end通过返回其签名声明的路径标签来产生方法调用的路径标签X
名词:
静态检查:基于程序的源代码来验证类型安全的过程;
信息流注释
解密:解除机密,不再当机密文件处理;
协变:简言之,就是父类型到子类型,变得越来越具体,在Java中体现在返回值类型不变或更加具体(异常类型也是如此)等