Modelo de capacidade de objeto - Object-capability model
O modelo de capacidade do objeto é um modelo de segurança de computador . Uma capacidade descreve um direito transferível de executar uma (ou mais) operações em um determinado objeto. Pode ser obtido pela seguinte combinação:
- Uma referência imprevisível (no sentido de referências de objeto ou ponteiros protegidos) que pode ser enviada em mensagens.
- Uma mensagem que especifica a operação a ser executada.
O modelo de segurança depende de não ser capaz de forjar referências.
-
- Os objetos podem interagir apenas enviando mensagens sobre referências.
- Uma referência pode ser obtida por:
- Condições iniciais: No estado inicial do mundo computacional que está sendo descrito, o objeto A já pode ter uma referência ao objeto B.
- Paternidade: se A cria B, nesse momento A obtém a única referência ao recém-criado B.
- Dotação: Se A cria B, B nasce com aquele subconjunto de referências de A com as quais A escolheu dotá-lo.
- Introdução: Se A tiver referências a B e C, A pode enviar a B uma mensagem contendo uma referência a C. B pode reter essa referência para uso subsequente.
No modelo de capacidade de objeto, todos os cálculos são realizados de acordo com as regras acima.
As vantagens que motivam a programação orientada a objetos , como encapsulamento ou ocultação de informações , modularidade e separação de interesses , correspondem a objetivos de segurança, como privilégio mínimo e separação de privilégios na programação baseada em capacidade.
O modelo de capacidade de objeto foi proposto pela primeira vez por Jack Dennis e Earl C. Van Horn em 1966.
Brechas em linguagens de programação orientadas a objetos
Algumas linguagens de programação baseadas em objeto (por exemplo , JavaScript , Java e C # ) fornecem maneiras de acessar recursos de outras maneiras além das regras acima, incluindo o seguinte:
- Atribuição direta às variáveis de instância de um objeto em Java e C #.
- Inspeção reflexiva direta dos metadados de um objeto em Java e C #.
- A capacidade generalizada de importar módulos primitivos, por exemplo, java.io.File que permitem efeitos externos.
Tal uso de autoridade inegável viola as condições do modelo de capacidade do objeto. Caja e Joe-E são variantes de JavaScript e Java, respectivamente, que impõem restrições para eliminar essas lacunas.
Vantagens dos recursos de objeto
O cientista da computação E. Dean Tribble afirmou que em contratos inteligentes , o controle de acesso baseado em identidade não suportava bem a alteração dinâmica de permissões, em comparação com o modelo de capacidade de objeto. Ele comparou o modelo ocap com dar a um manobrista a chave do carro, sem ceder o direito de propriedade do carro.
As propriedades estruturais dos sistemas de capacidade de objeto favorecem a modularidade no design do código e garantem o encapsulamento confiável na implementação do código.
Essas propriedades estruturais facilitam a análise de algumas propriedades de segurança de um programa de capacidade de objeto ou sistema operacional. Algumas delas - em particular, as propriedades do fluxo de informações - podem ser analisadas no nível de referências e conectividade de objetos, independentemente de qualquer conhecimento ou análise do código que determina o comportamento dos objetos. Como consequência, essas propriedades de segurança podem ser estabelecidas e mantidas na presença de novos objetos que contêm código desconhecido e possivelmente malicioso.
Essas propriedades estruturais derivam das duas regras que regem o acesso aos objetos existentes:
- 1) Um objeto A pode enviar uma mensagem para B somente se objeto Um contém uma referência para B .
- 2) Um objecto um pode obter uma referência a C apenas se objeto Um recebe uma mensagem que contém uma referência ao C .
Como consequência dessas duas regras, um objeto pode obter uma referência a outro objeto apenas por meio de uma cadeia de referências preexistente. Resumindo, "Somente conectividade gera conectividade."
- sistema de capacidade de objeto
- Um sistema computacional que implementa os princípios descritos neste artigo.
- objeto
- Um objeto tem estado e comportamento locais. Um objeto, nesse sentido, é tanto um sujeito quanto um objeto no sentido usado na literatura de controle de acesso.
- referência
- Um canal de comunicação imprevisível (ponteiro protegido, endereço opaco) que designa inequivocamente um único objeto e fornece permissão para enviar mensagens a esse objeto.
- mensagem
- O que é enviado em uma referência. Dependendo do sistema, as mensagens podem ou não ser objetos de primeira classe.
- solicitar
- Uma operação em que uma mensagem é enviada em uma referência. Quando a mensagem for recebida, o destinatário terá acesso a todas as referências incluídas na mensagem.
- atenuação
- Um padrão de design comum em sistemas de capacidade de objeto: dada uma referência de um objeto, crie outra referência para um objeto proxy com certas restrições de segurança, como permitir apenas acesso somente leitura ou permitir revogação. O objeto proxy executa verificações de segurança nas mensagens que recebe e repassa as que são permitidas. A atenuação profunda refere-se ao caso em que a mesma atenuação é aplicada transitivamente a quaisquer objetos obtidos por meio do objeto atenuado original, normalmente pelo uso de uma "membrana".
Implementações
Quase todos os sistemas históricos que foram descritos como "sistemas de capacidade" podem ser modelados como sistemas de capacidade de objeto. (Observe, no entanto, que alguns usos do termo "capacidade" não são consistentes com o modelo, como POSIX "capacidades".)
KeyKOS , EROS , Integrity (sistema operacional) , CapROS , Coyotos , seL4 , OKL4 e Fiasco.OC são sistemas operacionais seguros que implementam o modelo de capacidade de objeto.
Linguagens que implementam recursos de objeto
- Lei 1 (1981)
- Eden (1985),
- Emerald (1987),
- Trusty Scheme (1992),
- W7 (1995),
- Joule (1996),
- Original-E (1997),
- Oz-E (2005),
- Joe-E (2005),
- CaPerl (2006),
- Emily (2006)
- Caja (2007-presente)
- Monte (2008-presente)
- Pony (2014-presente)
- Wyvern (2012 – presente)
- Novilíngua (2007-presente)
- Hacklang (2021-presente)
- Rholang (presente em 2018)