What are capabilities?
A capability is a key that conveys specific rights to a particular object
在seL4微内核操作系统中,能力(capability)是一种抽象的概念,用于表示对特定对象的访问权限。这种机制是seL4安全模型的核心,它允许系统以一种细粒度和灵活的方式管理资源和访问控制。
能力可以被理解为一把钥匙,它赋予持有者特定的权限去操作或访问系统中的一个对象。这些对象可以是各种各样的资源,比如内存区域、设备、文件、进程或者系统调用等。每个能力都是唯一的,并且与特定的权限集相关联。
在seL4中,能力的主要特点包括:
- 唯一性:每个能力都是独一无二的,不能被其他能力复制或模拟。
- 权限表达:能力封装了对特定对象的一系列操作权限,如读取、写入、执行或管理等。
- 细粒度控制:系统可以根据需要创建具有不同权限的能力,从而实现对资源的精确控制。
- 安全性:能力可以被撤销或重新分配,而不影响系统中其他能力的安全性和有效性。
- 灵活性:能力模型允许用户根据应用程序的需求来设计复杂的权限结构,而不需要对操作系统内核进行修改。
- 最小权限原则:seL4遵循最小权限原则,即只授予完成任务所必需的最小权限集合,从而减少潜在的安全风险。
通过使用能力,seL4能够提供一个安全的运行环境,其中每个进程或服务都只能访问它需要的资源。这种模型有助于防止恶意软件或未经授权的访问,同时也简化了系统的整体安全策略。能力模型是seL4区别于其他操作系统的一个重要特性,它为构建高安全性和高可靠性的系统提供了坚实的基础。
As shown in Figure 4.1, a capability is an object reference; in that sense it is similar to a pointer (and implementation of capabilities are often referred as “fat pointers”). They are immutable pointers, in the sense that a capability will always reference the same object, so each capability uniquely specifies a particular object.
在seL4微内核操作系统中,能力(capability)确实可以被视作对象引用,这与指针在概念上是相似的。能力类似于指针,因为它们用于定位和访问系统中的特定对象。然而,与传统指针的主要区别在于,能力是不可变的(immutable),这意味着一旦创建,它们将始终引用同一个对象。因此,每个能力都唯一地指定了一个特定的对象。
这种不可变性是seL4中能力模型的关键特性之一,它为系统提供了几个重要的优势:
- 安全性:由于能力不会改变它们所引用的对象,系统可以确保在任何时候都能可靠地验证能力的合法性和有效性。这减少了由于指针篡改或对象引用错误导致安全漏洞的风险。
- 简化管理:不可变的能力简化了系统对资源的管理。系统不需要跟踪或处理能力本身的变更,这使得资源管理更加高效和直接。
- 明确性:每个能力都明确地与一个特定的对象相关联,这使得理解和验证系统的访问控制策略更加容易。开发者和系统管理员可以清楚地知道每个能力允许的权限和操作。
- 形式化验证:能力模型的这些特性使得形式化验证成为可能。在形式化验证中,系统的行为和特性可以通过数学方法进行证明和验证。不可变的能力模型有助于简化这一过程,因为它减少了需要考虑的状态变化和潜在的错误情况。
- 内存保护:在seL4中,能力模型与内存保护机制紧密集成。内核利用这些不可变的能力来确保每次系统调用都是安全的,并且不会违反内存保护规则。
能力模型的设计哲学是提供一种强大而灵活的方式来管理资源和权限。通过使用这种“胖指针”(fat pointers)的实现,seL4能够确保系统的安全性和可靠性,同时为开发者提供足够的自由度来构建复杂的应用程序和服务。这种模型是seL4能够支持高安全性和高可靠性系统的关键因素之一。
In addition to pointers, a capability also encodes access rights, in fact, the capability is an encapsulation of an object reference and the rights it conveys to that object. In a capability-based system, such as seL4, invoking a capability is the one and only way of performing an operation on a system object.
在基于能力的系统(capability-based system)中,如seL4,能力(capability)不仅仅是一个指向系统对象的指针,它还编码了对该对象的访问权限。实际上,能力是对象引用和它所赋予的访问权限的封装。这种设计允许系统以一种非常精确和安全的方式来管理资源和访问控制。
在seL4这样的系统中,能力的主要特点和作用包括:
- 访问控制:能力明确定义了持有者可以对引用的对象执行哪些操作。这些操作可能包括读取、写入、执行、管理或其他特定于对象的权限。
- 操作的唯一方式:在seL4中,调用能力是执行系统对象操作的唯一方式。这意味着,任何对系统资源的访问或操作都必须通过相应的能力来进行。这消除了未经授权的访问可能性,因为只有持有有效能力的实体才能执行操作。
- 封装性:能力将访问权限与对象引用封装在一起,使得权限管理更加直观和模块化。这有助于减少错误和安全漏洞,因为开发者和系统管理员可以更容易地理解和验证系统的访问控制策略。
- 最小权限原则:基于能力的系统遵循最小权限原则,即只授予完成任务所必需的最小权限集合。这有助于减少潜在的安全风险,并确保系统资源被有效利用。
- 灵活性和可扩展性:能力模型允许系统灵活地定义和扩展访问权限。随着系统的发展和新功能的添加,可以创建新的能力类型来满足新的需求,而不会影响现有的系统结构。
- 形式化验证:能力的明确定义和封装特性使得形式化验证成为可能。这允许通过数学方法来证明系统的安全性和正确性,从而提供更高级别的信任和可靠性。
通过这种基于能力的方法,seL4提供了一种强大而灵活的方式来管理资源和权限,确保了系统的安全性和可靠性。这种方法不仅适用于传统的操作系统任务,也适用于需要高安全性和高可靠性的复杂和关键系统,如航空航天、医疗设备、工业控制系统等。能力模型是seL4操作系统的一个关键特性,它为构建下一代安全和高效的系统提供了坚实的基础。
For example, an operation may be to call a function in a component. The object reference embedded in the capability then points to an interface to that object, and conveys the right to invoke that function (i.e. a particular method on the component object). The capability may or may not at the same time convey the right to pass another capability along as a function argument (delegating to the component the right to use the object referenced by the capability argument).
以调用组件中的函数为例,能力中嵌入的对象引用将指向该对象的接口,并传达调用该函数的权利(即组件对象上的特定方法)。这表示,持有相应能力的用户或进程有权执行与该能力关联的特定操作或方法。
此外,能力可能同时或不同时传达作为函数参数传递另一个能力的权利(将使用对象的权利委托给组件,允许其使用由能力参数引用的对象)。这种设计允许在系统中进行细粒度的权限控制和委托。
当能力允许传递另一个能力作为参数时,它实际上是在委托权限。这意味着被调用的组件(或函数)不仅可以执行指定的操作,还可以使用传递给它的额外能力来执行其他操作。这种委托可以是有限制的,也可以是完全的,具体取决于能力的设计和系统的安全策略。
例如,考虑一个文件系统服务,它提供了读取和写入文件的功能。一个能力可能允许用户读取文件,而另一个能力可能允许用户写入文件。如果服务决定允许某个客户端写入文件,它可能会提供一个写入能力作为响应。这个写入能力可以被客户端用来调用服务上的写入方法。 此外,如果服务还允许客户端将文件内容传递给另一个进程,它可能会提供一个允许客户端读取文件的能力。这样,客户端就可以将这个读取能力作为参数传递给另一个进程,从而允许该进程读取文件内容。
通过这种方式,基于能力的系统提供了一种灵活且安全的方法来管理访问权限和委托。它允许系统精确地控制每个组件、函数或对象的访问权限,并根据需要将这些权限委托给其他实体。这种模型对于构建安全可靠的复杂系统至关重要,因为它有助于防止未经授权的访问和操作,同时提供了足够的灵活性来支持各种不同的使用场景和需求。
This is a high-level description of what happens at the CAmkES abstraction level. In fact, at the CAmkES level, the capabilities themselves are abstracted away. Underneath, the connector is represented by an endpoint object, and the client component needs a capability with call right.
CAmkES(Component-based Architecture for Real-Time Embedded Systems)是一种用于构建实时嵌入式系统的框架,它提供了一套丰富的抽象来帮助设计师在高层次上构建和组合系统组件。在CAmkES中,能力(capabilities)的概念被进一步抽象化,以便更容易地管理和配置组件之间的通信和权限。
在CAmkES的抽象层次上,连接器(connectors)是组件之间通信的桥梁。它们在系统架构中被表示为端点对象(endpoint objects),这些端点定义了组件之间可以进行的交互类型。例如,一个端点可能允许客户端组件调用服务器组件上的特定服务。
在这种情况下,客户端组件需要具有调用这些服务的权利。在CAmkES中,这通常是通过分配给客户端一个具有调用权(call right)的能力来实现的。这个能力允许客户端通过连接器与服务器组件的端点进行交互。
这里的“调用权”是指客户端使用连接器与服务器组件通信的能力。这种权利是经过精心设计的,确保只有具有适当权限的客户端才能访问服务器组件提供的服务。这种设计有助于维护系统的安全性和完整性,同时提供了一种灵活的方式来控制组件之间的通信。
在CAmkES中,能力的抽象化简化了系统设计的过程。设计师不需要直接处理底层的能力分配和管理细节,而是可以专注于定义组件的行为、接口和它们之间的交互。这使得设计过程更加高效,并减少了设计错误的可能性。
总之,在CAmkES抽象层次上,通过使用端点对象和抽象化的能力,设计师可以更容易地构建复杂的实时嵌入式系统。这种方法不仅提高了设计的可管理性和可维护性,而且还有助于确保系统的安全性和可靠性。通过这种方式,CAmkES为实时嵌入式系统的开发提供了一种强大而灵活的框架。
It is this fine-grained, object-oriented nature that makes capabilities the access-control mechanism of choice for security-oriented systems. The rights given to a component can be restricted to the absolute minimum it needs to do its job, as required by the principle of least privilege.
能力的细粒度和面向对象的特性使其成为面向安全系统的首选访问控制机制。这种机制允许系统设计者根据组件的实际需要,精确地分配权限,确保每个组件仅获得完成其工作所必需的最小权限集。这一原则被称为最小权限原则(principle of least privilege),它是安全设计中的一个重要概念,目的是减少安全风险和潜在的未授权访问。
最小权限原则的核心思想是限制系统组件的权限,以降低安全漏洞的风险。如果一个组件不需要某项权限,那么即使在系统遭受攻击时,攻击者也很难通过该组件获得额外的权限或对系统的控制。通过这种方式,系统的安全性得到了增强,因为攻击者能够利用的潜在漏洞被大大减少。
在基于能力的系统中,如seL4或使用CAmkES框架的系统,最小权限原则可以通过以下方式实现:
- 细粒度的权限控制:系统可以为每个能力分配特定的权限,这些权限可以是读取、写入、执行或其他特定于对象的操作。这样,每个组件只能访问和操作它需要的资源。
- 封装和抽象:能力的封装性质意味着权限和对象引用是紧密耦合的。这种封装允许系统在不暴露不必要的信息或功能的情况下,提供必要的访问权限。
- 灵活的权限分配:系统可以根据组件的需求和角色灵活地分配权限。如果组件的职责发生变化,其权限也可以相应地调整,而无需修改其他组件或系统的整体安全策略。
- 审计和追踪:能力的使用可以被监控和记录,这有助于检测和调查潜在的安全问题。如果发现某个组件的权限被滥用,可以迅速采取行动,限制或撤销相关能力。
通过实施最小权限原则,基于能力的系统能够提供强大的安全保障,确保系统的稳定性和可靠性。这种安全策略不仅适用于实时操作系统,也适用于任何需要严格访问控制和安全保障的系统。通过这种方式,基于能力的系统为构建高安全性和高可靠性的应用程序和服务提供了坚实的基础。
Note that this notion of object capabilities is quite different from (and far more powerful than) what Linux calls “capabilities”, which are really access-control lists (ACLs) with system-call granularity. Linux capabilities, like all ACL schemes, suffer from the confused deputy problem, which is at the root of many security breaches, and explained in the next section. seL4 capabilities do not have this problem.
确实,seL4中的对象能力(object capabilities)概念与Linux系统中所称的“能力”(capabilities)有着本质的不同,并且功能更为强大。Linux系统中的能力实际上是一种访问控制列表(ACLs),其权限控制粒度仅限于系统调用级别。这种ACL方案存在所谓的“混乱代理问题”(confused deputy problem),这是许多安全漏洞的根源。
混乱代理问题是指当一个拥有高权限的进程(代理)被恶意利用来执行通常只有低权限进程才能执行的操作时发生的问题。在传统的ACL系统中,一旦一个进程获得了某个权限,它就可以代表任何其他进程执行该权限允许的操作,而不管这个操作是否真的应该由其他进程执行。这可能导致安全策略的执行不严格,从而增加了安全风险。
相比之下,seL4的能力模型不存在混乱代理问题。在seL4中,每个能力都是针对特定对象的,并且明确定义了可以对该对象执行的操作。没有一个进程可以代表另一个进程执行操作,除非它拥有对应的能力。这意味着,即使一个进程被赋予了高权限的能力,它也不能滥用这些能力来执行未经授权的操作。
seL4的能力模型提供了以下几个关键优势:
- 明确性:每个能力都明确地定义了它所允许的操作和它所关联的对象,这使得权限管理更加清晰和精确。
- 隔离性:由于每个能力都是独立的,因此一个能力的滥用不会影响到其他能力的安全。
- 安全性:能力模型遵循最小权限原则,减少了潜在的安全风险,并提供了更强的安全保障。
- 灵活性:能力模型允许灵活地分配和调整权限,以适应不同的系统需求和安全策略。
通过这些机制,seL4确保了系统的安全性和可靠性,使其成为需要高安全性和实时性的应用程序的理想选择。seL4的能力模型为构建安全、可预测和高效的系统提供了坚实的基础。
seL4 capabilities are also not susceptible to the attack of Boebert; this at-tack applies to capabilities directly implemented in hardware while seL4’s capa-bilities are implemented and protected by the kernel.
seL4的能力(capabilities)模型设计上避免了Boebert描述的攻击方式。Boebert的攻击模型主要针对的是直接在硬件中实现的能力系统。在这种攻击场景中,攻击者可能会尝试通过某种方式绕过硬件级别的能力检查,从而获得未授权的访问权限或者执行未授权的操作。
与直接在硬件中实现的能力相比,seL4的能力是由内核实现和保护的。这意味着所有的能力检查和管理都是在操作系统内核层面进行的,而不是在硬件层面。seL4的内核是以最小化和形式化验证为设计原则构建的,这使得它能够提供更加严格和可靠的安全保障。
在seL4中,内核严格控制着对所有系统资源的访问,包括内存、设备和进程等。内核执行的能力检查确保了只有持有适当能力的主体才能访问或操作特定的对象。此外,由于内核是经过严格验证的,它能够抵御各种攻击,包括Boebert攻击。
seL4内核的这种设计和实现方式提供了以下几个优势:
- 强大的隔离性:内核级别的能力检查确保了不同应用程序和系统组件之间的隔离,防止了潜在的未授权访问和冲突。
- 高安全性:内核的严格实现和形式化验证提供了对各种攻击的防护,包括那些针对硬件能力系统的攻击。
- 可靠性:由于内核的可靠性和稳定性,seL4能够保证系统在面对攻击时仍能正常运行,不会丢失数据或功能。
- 灵活性:尽管内核提供了严格和安全的能力管理,但它仍然允许灵活的权限分配和调整,以满足不同系统的需求。
总的来说,seL4的能力模型通过在内核层面实现和管理能力,避免了Boebert攻击等针对硬件级别能力系统的安全威胁。这为构建高安全性和高可靠性的系统提供了坚实的基础,特别是在需要严格安全保障的领域,如航空航天、医疗设备、工业控制系统和汽车电子等。
There are ten types of seL4 objects, all referenced by capabilities:
- Endpoints are used to perform protected function calls;
- Reply Objects represent a return path from a protected procedure call;
- Address Spaces provide the sandboxes around components (thin wrappers ab- stracting hardware page tables);
- Cnodes store capabilities representing a component’s access rights;
- Thread Control Blocks represent threads of execution;
- Scheduling Contexts represent the right to access a certain fraction of execution time on a core;
- Notifications are synchronisation objects (similar to semaphores);
- Frames represent physical memory that can be mapped into address spaces;
- Interrupt objects provide access to interrupt handling; and
- Untypeds unused (free) physical memory that can be converted (“retyped”) into any of the other types.
在seL4微内核操作系统中,有十种基本的对象类型,每种都通过能力(capabilities)来引用。这些对象类型构成了seL4的资源类型和系统构建块,它们分别是:
- 端点(Endpoints):用于执行受保护的函数调用。端点是seL4中的一种通信对象,允许客户端和服务器之间进行同步通信。
- 回复对象(Reply Objects):代表从受保护过程调用返回的路径。当一个端点用于发起调用时,与之关联的回复对象用于接收调用的返回值。
- 地址空间(Address Spaces):为组件提供沙箱环境(thin wrappers abstracting hardware page tables)。地址空间是内存管理的基本单位,它们封装了虚拟内存区域,并提供了隔离和保护机制。
- C节点(Cnodes):存储表示组件访问权限的能力。C节点是能力表,用于组织和管理其他能力,它们定义了系统中的访问控制结构。
- 线程控制块(Thread Control Blocks):代表执行线程。线程控制块包含了操作系统需要管理线程执行状态的所有信息。
- 调度上下文(Scheduling Contexts):代表在核心上访问一定比例的执行时间的权利。调度上下文与系统中的调度实体相关联,决定了线程的调度优先级和执行时间。
- 通知(Notifications):是同步对象(类似于信号量)。通知对象用于进程间的同步,它们可以被用于实现复杂的同步机制,如条件变量和屏障。
- 帧(Frames):代表可以映射到地址空间的物理内存。帧对象表示系统中的一块固定大小的物理内存区域,可以被映射到虚拟地址空间中。
- 中断对象(Interrupt Objects):提供中断处理的访问。中断对象允许线程注册和响应硬件中断,是处理异步事件的关键机制。
- 未类型内存(Untypeds):未使用(空闲)的物理内存,可以转换("retyped")成任何其他类型的对象。未类型内存是系统中尚未分配的内存区域,可以根据需要被重新类型化为其他对象类型。
这些对象类型共同构成了seL4的资源类型和系统构建块,它们通过能力的分配和管理,提供了一种强大而灵活的方式来构建和保护系统中的资源。通过这种机制,seL4能够确保系统的安全性和可靠性,同时为应用程序提供了必要的资源和服务。这种设计使得seL4非常适合于需要高安全性和实时性的复杂系统。
Why Capabilities?
Fine-grained access control
As observed above, capabilities provide fine-grained access control, in line with the se-curity principle of least privilege (also called principle of least authority, short POLA). This is in contrast to the more traditional access-control model of access-control lists (ACLs), which are used in mainstream systems such as Linux or Windows, but also in commercial, supposedly secure systems, such as INTEGRITY or PikeOS.
细粒度访问控制是现代安全体系中的一个重要概念,它允许系统精确地定义和管理对资源的访问权限。这种控制方式与最小权限原则(Principle of Least Privilege,POLA)紧密相连,该原则主张在一个计算机系统中,一个用户或程序应该拥有完成其任务所必需的最小权限集合,不多也不少。
能力(capabilities)提供了一种实现细粒度访问控制的有效机制。每个能力代表了一个特定的权限,允许持有者对特定的资源执行特定的操作。由于能力是针对单个资源和操作设计的,它们允许系统以非常精确的方式控制访问权限。例如,在seL4微内核中,每个系统资源(如内存区域、设备、文件等)都可以与一个特定的能力相关联,该能力定义了可以对该资源执行的操作。
与此相对的是传统的访问控制列表(ACLs)模型,它在许多主流操作系统(如Linux和Windows)以及一些商业化的所谓安全系统中(如INTEGRITY或PikeOS)得到应用。ACLs通常用于控制对系统资源的访问,它们列出了哪些用户或组可以对资源执行哪些操作。尽管ACLs提供了一定程度的访问控制,但它们通常不如基于能力的系统那样灵活和细粒度。
基于能力的系统与ACLs系统相比具有以下优势:
- 更少的权限:基于能力的系统遵循最小权限原则,确保每个实体只拥有完成任务所必需的权限,从而减少了潜在的安全风险。
- 更好的封装性:能力模型允许资源的封装和隐藏,使得系统组件之间的依赖关系最小化,提高了系统的模块化和可维护性。
- 更简单的安全策略:由于每个能力都明确定义了它所控制的权限,因此安全策略更加简单和直观,易于理解和管理。
- 更灵活的权限管理:能力模型允许动态地创建、修改和撤销权限,使得权限管理更加灵活和适应性强。
- 避免混乱代理问题:能力模型避免了混乱代理问题,即一个高权限的实体不会无意中提升低权限实体的权限。
总的来说,细粒度访问控制为构建安全可靠的系统提供了一种有效的手段。通过使用基于能力的方法,如seL4所采用的,系统设计者能够实现符合最小权限原则的安全策略,从而提高系统的整体安全性和可靠性。
To understand the difference, consider how access control works in Linux: A file (and the file model applies to most other Linux objects) has an associated set of access-mode bits. Some of these bits determine what operations its owner can perform on the file, others represent the operations permitted for each member of the file’s “group”, and a final set gives default rights to everyone else. This is a subject-oriented scheme: It is a property of the subject (the process that is attempting access) that determines the validity of the access, and all subjects with the same value of the property (user ID or group ID) have the same rights. Moreover, these subjects have the same rights to all files with the same settings of the access properties.
Linux系统中的访问控制机制是基于传统的主体(subject-oriented)模型,这种模型主要依赖于用户ID和组ID来管理对资源的访问权限。在Linux中,文件和其他对象都有一个与之关联的访问模式位集合(access-mode bits),这些位定义了不同主体对资源的访问权限。具体来说,这些访问模式位包括:
- 所有者权限:文件所有者可以执行的操作,如读取、写入和执行等。
- 组权限:文件所属组内的所有成员被允许执行的操作。
- 其他用户权限:系统上的其他所有用户默认拥有的操作权限。
这种模型的特点是,它根据尝试访问资源的主体(例如,正在运行的进程)的属性(如用户ID或组ID)来确定访问的有效性。具有相同属性值的所有主体(即相同的用户ID或组ID)拥有相同的权限。此外,具有相同属性值的所有主体对于具有相同访问设置的所有文件都具有相同的权限。
这种基于主体的访问控制模型的主要缺点是它不够灵活和细粒度。一旦权限被分配给某个用户或组,那么该用户或组内的所有成员都会获得相同的权限,而不管他们是否需要这些权限来完成他们的任务。这可能导致权限的过度分配,从而增加了安全风险。
相比之下,基于能力的访问控制模型(如seL4中的能力模型)提供了更高的灵活性和细粒度。在基于能力的系统中,每个资源(如文件、设备或内存区域)都与一个或多个能力相关联,这些能力定义了可以对该资源执行的特定操作。能力可以单独分配给不同的主体,而且可以根据需要精确地控制每个主体的权限。这意味着系统可以遵循最小权限原则,只授予每个主体完成其任务所必需的最小权限集合,从而降低了安全风险。
总结来说,基于主体的访问控制模型(如Linux中的模型)与基于能力的访问控制模型(如seL4中的模型)之间的主要区别在于权限分配的灵活性和细粒度。基于能力的模型提供了一种更安全、更精确的方式来管理资源访问权限,从而更适合于需要高安全性和可靠性的系统。
This is a very coarse-grain form of access control, and is a fundamental limitation on what security policies can be enforced. A typical scenario is that a user wants to run an untrusted program (downloaded from the internet) to process a particular file but wants to prevent the program from accessing any other files the user has access. This is called a confinement scenario, and there is no clean way to do this in Linux, which is the reason people came up with heavyweight workarounds (I like to call them hacks) such as “chroot jails”, containers etc.
您提到的是Linux系统中传统的基于权限位的访问控制机制,这种机制确实是一种相对粗粒度的访问控制方式。在这种机制下,系统对资源的访问权限是基于用户身份和组身份来管理的,而不是基于具体的任务或操作。这种设计限制了可以执行的安全策略,因为它不能精确地控制用户对特定资源的访问。
在您描述的典型场景中,用户希望运行一个来自不可信来源的程序(例如,从互联网下载的程序),同时希望限制该程序只能访问特定的文件,而不能访问用户有权访问的其他任何文件。这种需求被称为“隔离”(confinement)场景。在Linux系统中,由于缺乏细粒度的访问控制机制,很难干净利落地实现这种隔离。
为了解决这个问题,人们发明了一些复杂的解决方法,这些方法在某种程度上可以提供隔离,但通常需要额外的配置和管理开销。您提到的“chroot jails”和容器(containers)就是这样的解决方案:
- chroot jails:chroot命令允许改变某个进程的根目录,使其在一个新的目录树中执行。这样,该进程就只能访问和操作新的根目录下的文件和资源,从而达到隔离的效果。然而,这种方法并不是完全安全的,因为它依赖于进程对文件系统路径的处理,可能存在一些安全漏洞。
- 容器:容器技术提供了一种轻量级的隔离环境,允许在单个操作系统实例中运行多个隔离的应用程序。容器共享同一个操作系统内核,但是每个容器都有自己的文件系统、进程空间和网络接口。容器技术通过提供资源隔离和资源限制来增强安全性,但它并不是完美的解决方案,仍然需要谨慎配置和管理。
相比之下,基于能力的系统如seL4,通过为每个资源分配唯一的能力,能够更精确地控制对资源的访问。在这种系统中,用户可以为不可信程序创建一个具有最小权限的能力,确保它只能访问特定的文件,而无法访问其他任何资源。这种方法提供了更细粒度的访问控制,从而更有效地实现了隔离场景,而无需依赖于复杂的工作区或容器技术。
总之,基于能力的访问控制机制提供了一种更为精确和安全的方式来管理资源访问权限,特别适合于需要严格隔离和最小权限控制的应用场景。这种机制避免了Linux等传统操作系统中的一些根本性限制,为构建高安全性的系统提供了更好的支持。
With capabilities, this problem is straightforward to solve, as capabilities provide an object-oriented form of access control. Specifically, the kernel will allow an operation to go ahead if and only if the subject that requests the operation presents a capability that empowers it to perform the operation. In the confinement scenario, the untrusted app can only access files to which it has been given a capability. So Alice invokes the program, handing it a capability to the one file the program is allowed to read, plus a capability to a file where the program can write its output, and the program is unable to access anything else – proper least privilege.
确实,使用能力(capabilities)模型可以直截了当地解决隔离场景下的问题。在基于能力的系统中,内核允许执行操作的条件是请求操作的主体(subject)能够提供一个能力,该能力授权它执行该操作。这种模型遵循面向对象的访问控制方法,每个资源都与一个或多个能力相关联,这些能力定义了对该资源的访问权限。
在您描述的隔离场景中,不信任的应用程序(untrusted app)只能访问它被明确赋予能力的文件。具体操作如下:
- Alice(用户)启动程序,并仅向程序提供两个能力:
- 一个能力关联到程序被允许读取的文件。
- 另一个能力关联到程序可以写入输出的文件。
- 程序执行:程序只能使用它被提供的这些能力来访问指定的文件。由于没有提供其他文件的访问能力,程序无法访问任何其他资源。
- 最小权限原则:这种方法遵循最小权限原则,即只授予程序完成任务所必需的最小权限集合。这样,程序被严格限制在Alice所定义的访问范围内,无法越权访问其他文件或资源。
通过这种方式,基于能力的系统确保了应用程序的隔离和安全。这种模型不仅简化了安全策略的实施,还提高了系统的安全性和可靠性。由于能力是细粒度的,系统设计者和管理员可以精确地控制每个应用程序的访问权限,从而有效地防止潜在的安全威胁和数据泄露。
总之,基于能力的访问控制机制为实现严格的隔离和最小权限原则提供了一种有效的方法。这种方法在需要高安全性和细粒度访问控制的场景中特别有用,如运行不受信任代码的环境、多租户云计算平台、以及需要严格访问控制的企业系统等。通过使用能力,系统可以确保每个应用程序或服务都只能访问它需要的资源,从而保护系统免受未授权访问和其他安全风险的影响。
Interposition and delegation
Capabilities have further nice properties. One is the ability to interpose access, which is a consequence of the fact that they are opaque object references. If Alice is given a capability to an object, she has no way of knowing what that object really is, all she can do is invoke methods on the object.
能力(capabilities)的确具有一些非常好的属性,其中之一就是能够插入(interpose)访问。这种属性是能力作为不透明对象引用的结果。当Alice获得一个对象的能力时,她无法知道该对象到底是什么,她所能做的只是调用该对象上的方法。
这种设计有几个重要的安全和隐私方面的优势:
- 隐藏实现细节:由于能力是不透明的,它们隐藏了对象的实现细节。这意味着即使Alice拥有访问某个对象的能力,她也无法通过能力了解对象的内部结构或状态。这有助于保护对象的隐私和安全,防止潜在的滥用或未授权的信息泄露。
- 限制操作范围:Alice只能通过能力执行定义好的方法。这意味着她不能执行任何未授权的操作,即使她试图通过其他手段访问对象。这种限制确保了系统的安全性和稳定性。
- 简化安全策略:由于能力的不透明性,系统管理员和设计者可以更容易地定义和实施安全策略。他们只需要关注能力的分配和管理,而不需要担心对象的内部细节。
- 支持安全编程:对于开发者来说,能力的不透明性支持了安全编程实践。开发者可以编写只依赖于对象接口的代码,而不需要担心对象的实现或潜在的安全问题。
- 促进模块化设计:能力的这种属性促进了系统的模块化设计。每个模块可以独立地实现其功能,而不需要暴露其内部工作机制。这有助于提高系统的可维护性和可扩展性。
- 增强灵活性:能力的不透明性还允许系统在不影响客户端代码的情况下进行更改。例如,系统可以更换对象的实现,只要新实现提供相同的接口和行为,客户端代码就无需修改。
总的来说,能力的不透明性和插入访问的能力为系统提供了强大的安全保障,同时简化了安全策略的管理和实施。这种设计使得基于能力的系统非常适合于需要高安全性、隐私保护和灵活设计的应用程序和服务。通过使用能力,系统可以确保每个组件或用户只能访问和操作它们被授权的资源,从而保护系统免受潜在的安全威胁。
For example, the system designer may pretend that the capability given to Alice refers to a file, when in fact it refers to a communication channel to a security monitor, which in turns holds the actual file capability. The monitor can examine Alice’s requested operations and, if valid, performs them on the file on her behalf, while ignoring invalid ones. The monitor effectively virtualises the file.
这个例子展示了能力模型中的一个高级特性,即通过能力中介(intermediary)来实现对资源的虚拟化和控制。在这个场景中,系统设计者可以创建一个特殊的能力,这个能力表面上看起来是对某个文件的引用,但实际上它引用的是一个安全监控器(security monitor)的通信通道。
安全监控器是一个特殊的系统组件,它负责管理和控制对敏感资源(在这个例子中是文件)的访问。当Alice尝试通过这个能力执行操作时,她的请求首先会被发送到安全监控器。监控器会检查Alice的请求,确定操作是否有效和合法。
如果请求是有效的,安全监控器将代表Alice执行相应的操作。例如,如果Alice请求读取文件,监控器在验证了她的请求之后,会使用它自己持有的实际文件能力来读取文件,并将结果返回给Alice。这样,Alice就能够访问文件,但是所有的操作都是通过安全监控器进行的。
如果请求是无效的,安全监控器可以拒绝操作,从而保护文件不受未授权的访问或潜在的恶意操作的影响。这种机制确保了文件的安全性和完整性,同时提供了一种灵活的方式来控制对资源的访问。
通过这种方式,安全监控器实际上虚拟化了文件,为Alice提供了一个受控的、安全的接口来访问文件。这种虚拟化不仅增强了安全性,还允许系统设计者实现更复杂的访问控制策略和安全机制。例如,监控器可以记录所有对文件的操作,提供审计跟踪,或者根据Alice的身份和权限动态调整她可以执行的操作。
总之,通过使用能力模型和中介机制,系统设计者可以创建一个更加安全、灵活和可控的环境。这种方法不仅可以保护敏感资源,还可以提供高级的安全功能,如操作审计、权限验证和策略执行。这种设计在需要严格安全控制的环境中尤其有用,如金融服务、医疗保健和政府机构等领域。
Interposition has applications beyond enforcing security policies; the approach can be used for packet filtering, information-flow tracing and many more. A de-bugger can transparently interpose and virtualise object invokations. It can even be used to create objects lazily: Instead of an object reference, Alice is given a capability to a constructor, which then replaces the capability once the object has been created.
插入(Interposition)技术的确不仅限于强化安全策略,它还可以应用于多种场景,包括数据包过滤、信息流追踪等。这种技术的核心优势在于它允许在不修改现有代码的情况下,对系统的行为进行监控和修改。
- 数据包过滤:在网络通信中,插入技术可以用来实现数据包过滤。通过在网络栈中插入一个过滤层,系统可以检查经过的每个数据包,并根据预定义的规则允许或拒绝数据包的传输。这种方法可以用于实现防火墙、入侵检测系统和其他网络安全机制。
- 信息流追踪:插入技术还可以用于追踪程序中的信息流。这对于理解复杂软件系统的行为、调试和性能分析非常有用。通过在关键点插入追踪代码,开发者可以收集关于数据如何在系统中流动的信息,从而帮助识别瓶颈、错误和潜在的安全问题。
- 调试工具:在调试软件时,插入技术可以让调试器透明地介入并虚拟化对象的调用。这意味着调试器可以在不改变程序正常执行流程的情况下,监控和修改程序的状态。例如,调试器可以使用插入技术来模拟异常情况,测试程序的健壮性。
- 延迟对象创建:插入技术还可以用于实现对象的延迟创建(lazy object creation)。在这种情况下,Alice可能被给予一个能力,这个能力指向一个构造器(constructor),而不是一个已经存在的对象。当Alice首次使用这个能力时,构造器会被触发,创建实际的对象,并将能力更新为指向新创建的对象。这种方法可以优化资源使用,因为对象只在真正需要时才被创建。
插入技术提供了一种强大的机制,允许开发者和系统管理员以透明和灵活的方式监控、控制和修改系统的行为。通过使用能力模型和插入技术,系统可以支持更广泛的应用场景,同时保持高度的安全性和可靠性。这种技术在需要细粒度控制和动态行为调整的系统中尤其有价值。
Another advantage of capabilities is that they support safe and efficient delegation of privilege. If Alice wants to give Bob access to one of her objects, she can create (“mint” in seL4 speak) a new capability to the object and hand it to Bob. Bob then can use that capability to operate on the object without referring back to Alice. (If, instead, Alice does want to stay in the loop, it can use virtualisation as explained above.)
能力的另一个优势在于它们支持安全且高效地委派权限。当Alice想要给予Bob对她某个对象的访问权限时,她可以创建一个新的能力并将其交给Bob。Bob随后可以使用这个能力来操作对象,而无需再与Alice进行交互。这种方式确保了权限委派的安全性和独立性。
以下是委派权限过程中的几个关键点:
- 创建能力:Alice通过创建一个新的能力来授予Bob对对象的访问权限。在seL4中,这个过程有时被称为“铸币”(minting),因为Alice实际上是在生成一个新的能力。
- 独立操作:一旦Bob拥有了这个能力,他就可以独立地对对象执行操作,而不需要Alice的进一步介入。这使得Bob能够自主地完成任务,同时确保了Alice的资源不会被未授权的使用。
- 灵活性:Alice可以根据Bob所需的权限范围来创建能力。她可以选择授予Bob完全的控制权,或者只授予他执行特定操作的权限。这种灵活性使得能力模型非常适合于复杂的权限管理和安全策略。
- 撤销权限:如果Alice需要撤销Bob的访问权限,她可以简单地停止向Bob提供相关的能力。在某些情况下,如果Bob持有的能力是唯一的,Alice甚至可以创建一个新的能力来取代Bob手中的旧能力,从而实现权限的撤销。
- 无需中介:在某些情况下,Alice可能希望Bob在操作对象时保持独立,而不需要她作为中介。这种直接的权限委派方式简化了权限管理,并减少了系统复杂性。
通过这种安全且高效的方式,能力模型为系统中的权限委派提供了一种可靠的解决方案。它不仅支持细粒度的权限控制,还允许系统设计者和管理员根据实际需求灵活地调整权限分配。这种模型特别适用于需要动态权限管理和高安全性的系统,如多用户环境、分布式系统和服务导向架构(SOA)。通过使用能力,系统可以确保每个用户或组件都只能访问和操作它们被授权的资源,从而保护系统免受潜在的安全威胁。
The new capability can have diminished rights; Alice can use this to give Bob only read-only access to the file. And Alice can revoke Bob’s access at any time by destroying the derived capability she handed to Bob.
能力模型的一个关键特性是它允许Alice以受限制的方式创建新的能力,从而给予Bob有限的权限。例如,Alice可以创建一个只有读取权限的能力,从而允许Bob仅访问文件的内容,而不能进行写入或其他修改操作。这种方式确保了Bob的访问权限被限制在Alice所允许的范围内。
此外,Alice可以随时撤销Bob的访问权限。如果Alice决定Bob不再需要访问文件,或者出于安全考虑需要收回权限,她可以销毁之前交给Bob的派生能力。销毁能力是一个安全的操作,一旦执行,Bob手中持有的能力将变得无效,他将无法再使用该能力来访问文件或执行任何操作。
这种能力模型的优势在于:
- 灵活性:Alice可以根据需要随时调整Bob的访问权限,无论是增加、减少还是撤销权限。
- 安全性:通过销毁能力,Alice可以迅速响应安全事件或策略变更,确保系统的安全性不受威胁。
- 可控性:Alice对Bob的访问权限有完全的控制,可以随时监控和审计Bob对文件的访问情况。
- 简便性:能力模型简化了权限管理的过程,Alice不需要复杂的配置或额外的工具来管理Bob的访问权限。
通过这种方式,能力模型为系统提供了一种强大且灵活的权限管理机制。它不仅有助于保护系统资源,防止未授权的访问和潜在的安全风险,还为系统设计者和管理员提供了一种有效的工具,以支持动态和细粒度的权限控制。这种模型特别适合于需要严格访问控制和权限审计的环境,如企业信息系统、在线服务平台和嵌入式系统等。
Delegation is powerful and cannot easily and safely be done in ACL systems. A typical case of its use is setting up sub-systems that manage resources autonomously. When the system starts up, the initial process holds authority to all resources in the system (other than the small and fixed amount the kernel uses itself). This initial resource manager can then partition the system, by creating new processes (secondary resource managers) and handing them privilege to disjoint subsets of the system resources.
委派(Delegation)是一种在能力(capability)系统中非常强大的机制,它允许安全地将权限和控制权从一个主体传递给另一个主体。这与ACL(Access Control List)系统中的权限管理方式形成鲜明对比,在ACL系统中,委派通常不容易或安全地实现。
在基于能力的系统中,典型的使用委派的场景包括设置子系统(sub-systems)来自主管理资源。以下是这个过程的一般步骤:
- 初始过程:系统启动时,初始进程(通常是操作系统的一部分)拥有系统中所有资源的权限(除了内核自身使用的一小部分资源)。
- 创建子资源管理器:初始进程可以创建新的进程,这些新进程被称为次级资源管理器(secondary resource managers)。每个次级资源管理器都被设计来管理特定类型的资源或执行特定的任务。
- 分配权限:初始进程通过创建新的能力并将它们交给次级资源管理器,从而将对系统资源的控制权分配给这些管理器。每个次级资源管理器获得的能力使其能够管理一组不相交的系统资源子集。
- 自主管理:一旦获得了相应的能力,次级资源管理器就可以自主地管理它们被授权的资源。它们可以决定如何分配这些资源给更下层的应用程序或服务,以及如何执行资源的调度和监控。
这种基于能力的委派机制具有以下几个优点:
- 安全性:由于能力是不透明的,次级资源管理器无法知道它们管理的资源在系统中的具体位置或性质。它们只能通过能力来管理资源,这防止了潜在的安全漏洞。
- 灵活性:初始进程可以根据需要灵活地创建新的资源管理器,并为它们分配适当的权限。这种设计支持系统的模块化和扩展性。
- 隔离性:每个次级资源管理器管理的资源集是隔离的,这有助于防止资源冲突和提高系统的稳定性。
- 最小权限原则:通过委派机制,系统可以确保每个资源管理器只拥有完成其任务所必需的最小权限集合,这符合最小权限原则。
基于能力的委派机制为构建复杂、模块化和安全的系统提供了一种有效的工具。通过这种方式,系统设计者可以创建出能够自主管理资源的子系统,同时保持对整个系统的高度控制和安全性。这种模型在需要高度自治和可扩展性的系统中特别有用,如大型分布式系统、云计算平台和复杂的企业级应用。
The subsystems can then autonomously (without referring back to the original man-ager) control their subset of resources, while unable to interfere with each other. Only if they want to change the original resource allocation do they need to involve the original manager.
基于能力的系统设计允许子系统(subsystems)自主地管理它们各自的资源子集,而不会影响到其他子系统。这种设计确保了子系统之间的隔离性和独立性,同时也保护了整个系统的安全性和稳定性。
以下是这种设计的几个关键优势:
- 自治性:每个子系统都可以独立地管理它所控制的资源,而无需与原始管理器(original manager)或其他子系统进行通信。这种自治性使得子系统能够快速响应本地事件和变化,提高了系统的效率和响应能力。
- 隔离性:由于每个子系统只能访问和管理它自己的资源子集,它们无法干预其他子系统的操作。这种隔离性有助于防止资源冲突和潜在的安全问题,同时也简化了系统的调试和维护。
- 最小权限原则:子系统仅获得执行其功能所必需的资源和权限,这符合最小权限原则。这种权限控制机制减少了安全风险,并限制了子系统可能造成的损害。
- 灵活性和可扩展性:如果子系统需要更多的资源或者需要改变资源分配,它们可以请求原始管理器进行调整。这种设计允许系统在运行时动态地调整资源分配,以适应不断变化的需求。
- 简化的权限管理:原始管理器负责整个系统的初始资源分配和高层次的权限控制,而子系统负责具体的资源管理。这种分层的权限管理简化了系统的配置和维护。
通过这种方式,基于能力的系统提供了一种强大且灵活的资源管理框架。它支持子系统的自治性,同时保持了整个系统的安全性和稳定性。这种模型特别适用于需要高度自治和模块化的大型系统,如云计算平台、分布式数据库和复杂的企业软件系统。通过使用能力,系统设计者可以构建出能够适应不断变化需求的可扩展和可维护的系统。