Software de Telecomunicações Verificação de modelos com a ferramenta Murphi Prof RG Crespo Software de Telecomunicações Murphi : 1/38 Introdução (1) Passos na análise da segurança de protocolos, baseados em modelos Descrição protocolo Requisitos protocolo (modelo) Modelo intruso Falhas de segurança Analisador Propriedades de segurança (especificação) Prof RG Crespo Software de Telecomunicações Murphi : 2/38
Introdução (2) Várias técnicas têm sido exploradas na verificação formal da segurança de protocolos Varrimento dos estados finitos Blast, programas escritos em C Murϕ, programas escritos em Pascal SMV SPIN, Programas escritos em Promela Modelo de estados infinitos (SRI) Álgebra de processos (cálculo π) Modelos probabilísticos (PRISM) Na disciplina usa-se a ferramenta Murϕ, Univ. Stanford/US, acessível em http://sprout.stanford.edu/dill/murphi.html Prof RG Crespo Software de Telecomunicações Murphi : 3/38 Murϕ: introdução (1) O sistema é descrito por Variáveis de estado inicializadas (tabelas de dispersão usadas, para evitar repetição de estados) Regras de transição para cada participante no protocolo Comunicação implementada por variáveis partilhadas O Murϕ varre os estados, por onde o sistema pode passar, terminando quando identificar violação das regras de segurança. bloqueio ( deadlock ) por o estado não ter transições para outro Nota: directiva ndl não verifica bloqueio Prof RG Crespo Software de Telecomunicações Murphi : 4/38
Murϕ: introdução (2) Actuais ferramentas permitem analisar até 10 8-10 10 estados. Nota1: Para variáveis com 10 valores, 10 8 é coberto por 8 variáveis. Se o espaço de variáveis for reduzido para 3 valores, 10 3*3 e 10 8 é coberto por 16 variáveis. Nota2: normalmente, os protocolos não cobrem todos os estados gerados pelos espaços das variáveis (certas combinações não têm significado). Para reduzir espaço de pesquisa, adoptadas simplificações: Número finito de participantes (ex: 2 clientes, 2 servidores) Números aleatórios representados por constantes (r1, r2, ) Prof RG Crespo Software de Telecomunicações Murphi : 5/38 Murϕ: introdução (3) Passos na análise de segurança em protocolos 1. Representação do protocolo Definir tipo de dados para cada mensagem. Descrever o comportamento de cada participante, por uma máquina de estados finitos. Descrever a condição de segurança como invariante de estado. 2. Adição do intruso Acede a todas as mensagens ( buffer partilhados) Murϕ tenta todas as combinações possíveis de intercepção, divisão e guarda de mensagens geração de novas mensagens a partir dos dados observados e conhecimentos iniciais (ex: chaves públicas) Prof RG Crespo Software de Telecomunicações Murphi : 6/38
Murϕ: introdução (4) O programa a submeter ao Murϕ é formado por 3 partes: 1. Declarações i. Constantes (const) ii. Tipos de dados (type) iii. Variáveis globais (var) 2. Rotinas não aninhadas 3. Comportamento do sistema: Regras de transição Definição dos estados iniciais Invariantes a terem de ser satisfeitos em todos os estados Prof RG Crespo Software de Telecomunicações Murphi : 7/38 Murϕ: introdução (5) Um estado é definido pelo valor das variáveis globais. As falhas de segurança ocorrem quendo o sistema entre num estado que não satisfaz o invariante. Problema Down Benchmark: Numa tabela de inteiros é aplicada uma função de decrementar todas as posições até ao índice máximo. O invariante é detwerminado pela condição da soma da tabela ter de ser positiva (>0). O problema é incluído na distribuição do Murϕ no ficheiro Murphi3.1/ex/toy/down.m Prof RG Crespo Software de Telecomunicações Murphi : 8/38
Murϕ: declarações (1) A. Bloco de constantes const {id: expressão-inteira;} Zero, uma, ou mais Ex: Down Benchmark const INITIAL_VAL: 5; -- valor inicial da tabela L: 1; H: 6; -- índices inferior e máximo MAX_VAL:(H-L+1)*INITIAL_VAL; Prof RG Crespo Software de Telecomunicações Murphi : 9/38 Murϕ: declarações (2) B. Tipos type {id: tipo;} O Murϕ suporta os seguintes tipos de dados: boolean -- booleanos, constantes true e false <expr>.. <expr> -- gama de valores enum { id {,id} } -- enumerados scalarset( <expr> {,<expr>} ) -- conjunto de valores, não ordenados e não identificados union { tipo {, tipo} } -- grupos de scalarset record { decl-var } end -- estruturas array [ tipo ] of tipo -- tabelas de objectos multiset [ DIM ] of tipo -- colecções não ordenadas de objectos de -- determinado tipo e tamanho máximo DIM Prof RG Crespo Software de Telecomunicações Murphi : 10/38
Murϕ: declarações (3) Nota1: não há inteiros, devido ao elevado espaço ocupado pelos literais. Nota2: limites dos enumerados e dimensão do scalarset devem poder ser calculados na altura da declaração. Nota3: não existem literais nos scalarset. Valores podem ser atribuídos a variável id de tipo scalarset pelas instruções forall, exists, for, ruleset ou atribuição de outra variável de tipo scalarset. Ex: Down Benchmark type ind_t: L..H; val_t: 0..INITIAL_VAL; arr_t: Array[ ind_t ] Of val_t; sum_t: 0.. MAX_VAL; Prof RG Crespo Software de Telecomunicações Murphi : 11/38 Murϕ: declarações (4) C. Variáveis de estado var {id: tipo;} Ex: Down Benchmark var a: arr_t; Prof RG Crespo Software de Telecomunicações Murphi : 12/38
Murϕ: instruções (1) <stmts> ::= <stmt> {; <stmt> } --- as instruções são separadas por ; A. Atribuição id := <expr> B. Retorno de função return [ <expr>] C. Condicional if <expr> then [ <stmts> ] { elsif <expr> then [ <stmts> ] } [ else [ <stmts> ] ] endif Prof RG Crespo Software de Telecomunicações Murphi : 13/38 Murϕ: instruções (2) D. Escolha valores switch <expr> { case <expr> then [ <stmts> ] } [ else [ <stmts> ] ] endswitch E. Varrimento for <quantif> do [ stmts ] endfor <quantif> ::= id:<tipo> id := <expr> to <expr> [by <expr>] F. Ciclo while <expr> do [ stmts ] end Prof RG Crespo Software de Telecomunicações Murphi : 14/38
Murϕ: instruções (3) G. Geração erro error <string> --- termina verificação e imprime string H. Asserção assert <expr> [ <string> ] --- equivale if!<expr> then error <string> end I. Chamada a procedimento id ( <expr> {, <expr> }) J. Impressão put ( <expr> <string> ) Prof RG Crespo Software de Telecomunicações Murphi : 15/38 Murϕ: instruções (4) As expressões podem ser formadas por Operadores inteiros (+, -, *, /, %) Operadores relacionais (=,!=, >, >=, <, <=) Operadores lógicos (!,, &, ->) Chamada a funções Quantificador universal forall <quantif> do <expr> endforall Quantificador existencial exists <quantif> do <expr> endforall Localização id {. id [ <expr> ] } Nota: nos quantificadores, <expr> deve ser de tipo booleano Prof RG Crespo Software de Telecomunicações Murphi : 16/38
Murϕ: rotinas (1) As rotinas (procedure ou function), não aninhadas, são todas declaradas entre as declarações e o programa. procedure id( [ par {; par} ]); [ <decl> begin ] [ <stmts> ] opcional function id ([ par {; par} ]) <tipo>; [ <decl> begin ] [ <stmts> ] Prof RG Crespo Software de Telecomunicações Murphi : 17/38 Murϕ: rotinas (2) Parâmetros podem ser passados por referência ou por valor Ex: Down Benchmark procedure Decrement( var dec : val_t ); begin if dec >= 1 then dec := dec-1; Function Sum( a : arr_t ): sum_t; var sum : sum_t; begin sum := 0; for i : ind_t do sum := sum+a[i]; return sum; Prof RG Crespo Software de Telecomunicações Murphi : 18/38
Murϕ: scalarset Seja a declaração var id:multiset[dim] of type; mutisetadd(<expr>,loc) -- armazena valor ismember(<expr>,type) -- verifica se expressão está armazenada multisetcount(i:loc,<expr>) -- devolve numero de valores armazenados, que satisfazem -- condição indicada pela expressão booleana Prof RG Crespo Software de Telecomunicações Murphi : 19/38 Murϕ: regras (1) As regras de comportamento identificam as transições no autómato. Cada regra é dividida em condição e acção. O Murϕ armazena os estados percorridos, por omissão em largura. Os estados visitados são marcados, bem como todas as transições percorridas. O verificador executa todos os traços possíveis. Se for atingido um estado que não satisfaça o invariante, ou um estado sem transições, termina execução. O Murϕ é formado por regras simples. Outros construtores facilitam a especificação do protocolo. ruleset e startstate Invariante Choose Prof RG Crespo Software de Telecomunicações Murphi : 20/38
Murϕ: regras (2) A. Simples <simplerule> ::= rule [<string>] [ <expr> ==> ] [ {<decl>} ] begin [ stmts ] -- normalmente altera estado do sistema end Nota: a expressão tem de ser de tipo booleano e determina a pré-condição para execução da transição Prof RG Crespo Software de Telecomunicações Murphi : 21/38 Murϕ: regras (3) B. Conjunto <ruleset> ::= ruleset <quantif> { ; <quantif> } do <regras> end As <regras> são duplicadas, com a substituição dos identificadores por cada um elementos do scalarset ou intervalo de valores. Prof RG Crespo Software de Telecomunicações Murphi : 22/38
Murϕ: regras (4) Ex: Down Benchmark ruleset i : L.. H do rule a[i] > 0 ==> begin Decrement( a[i] ); if i+1 < H then if a[i+1] > 0 then Decrement(a[i+1]); Prof RG Crespo Software de Telecomunicações Murphi : 23/38 Murϕ: regras (5) C. Início <startstate> ::= startstate [ <string> ] [ { <decl> } ] begin <stmts> end As regras <startstate> são executada apenas no início da verificação. As instruções devem inicializar as variáveis. Prof RG Crespo Software de Telecomunicações Murphi : 24/38
Murϕ: regras (6) Ex: Down Benchmark startstate begin for i : ind_t do a[ i ] := INITIAL_VAL; Prof RG Crespo Software de Telecomunicações Murphi : 25/38 Murϕ: regras (7) D. Invariantes <invariant> ::= invariant [ <string> ] <expr> O invariante corresponde à regra rule end!<expr> ==> error <string> Ex: Down Benchmark invariant "Positive sum" Sum(a) > 0; Prof RG Crespo Software de Telecomunicações Murphi : 26/38
Murϕ: regras (8) E. Choose choose i:loc do O Murϕ selecciona um elemento de uma localização de tipo multiset Prof RG Crespo Software de Telecomunicações Murphi : 27/38 Modelo intruso Dolev-Yao As capacidades de um intruso são descritas no modelo proposto por Dolev e Yao*. No modelo, o intruso pode Pode interceptar e emitir mensagens Pode dividir e formar pares Pode cifrar/decifrar mensagens desde que conheça a chave. * On the security of public key protocols; D. Dolev and A. Yao; IEEE Transations on Information Theory 29(2), pp 198-208; Mar 1983. Prof RG Crespo Software de Telecomunicações Murphi : 28/38
Exemplo (1) Consideremos um protocolo inseguro de envio de uma mensagem secreta As chaves são conhecidas apenas pelos donos. I {M}K I {M}K I K R R Nota: protocolo falha, porque as mensagens não são autenticadas I E R {M}K R {M}K I {M}K I K E {M}K E {O}K E {O}K E K R {O}K R Prof RG Crespo Software de Telecomunicações Murphi : 29/38 Exemplo (2) 1. Canais de comunicação implementados por uma variável global de tipo multiset Const NetworkCap: 2; -- max number of outstanding msgs in the net Type Message: record -- message contents Var net: multiset[networkcap] of Message; -- network Prof RG Crespo Software de Telecomunicações Murphi : 30/38
Exemplo (3) 2. Estado do agente determinado por variável de tipo enumerado. O estado de partida deve ser testado na précondição Type InitiatorStates: enum{i_sleep,i_wait, I_COMMIT}; Initiator:record state: InitiatorStates; Var ini: array[initiatorid] of Initiator; Prof RG Crespo Software de Telecomunicações Murphi : 31/38 Exemplo (4) 3. Intercepção implementada por envio de mensagens do nó para todos os restantes agentes Type InitiatorId: scalarset(numinitiators); ResponderId: scalarset(numresponders); EavesdropperId: scalarset(numeavesdroppers); AgendId: union{initiatorid, ResponderId, EavesdropperId}; Prof RG Crespo Software de Telecomunicações Murphi : 32/38
Exemplo (5) ruleset i:initiatorid do ruleset d:agentid do rule 01 "Initiator sends ciphered message ini[i].state=i_sleep &!ismember(d,initiatorid) -- only to Responder and Intruder ==> var outm: Message; -- outgoing message begin -- constructs message mutisetadd(outm,net); -- message sent! Prof RG Crespo Software de Telecomunicações Murphi : 33/38 Exemplo (6) 4. Intruso guarda mensagens num multiset Const MaxKnowledge:5; -- max number of msgs intruder can remember Type Intruder:record gotit: boolean; store: mutiset[maxknowledge] of Messages; Var int: array[eavesdropperid] of Intruder; Prof RG Crespo Software de Telecomunicações Murphi : 34/38
Verificação (1) Para gerar o ficheiro de verificação, executar o Makefile MU = /usr/local/share/murphi3.1/bin/mu.x86 INCLUDE = /usr/local/share/murphi3.1/include/ CXX = g++ CFLAGS = -DCATCH_DIV -fno-default-inline -Wnodeprecated test: test.c ${CXX} ${CFLAGS} -I${INCLUDE} test.c -o test lm test.c: test.m ${MU} -c test.m clean: rm -f test test.c Prof RG Crespo Software de Telecomunicações Murphi : 35/38 Verificação (2) Verificação executada directamente no programa gerado Opções disponíveis -h imprime lista de comandos -ndl não verifica bloqueio -p muito mais verboso Exemplo de verificação com opção -p ------------------------------ Unpacking state from queue: ini[initiatorid_1].state:i_sleep res[responderid_1].state:r_sleep res[responderid_1].deliver:undefined int[eavesdropperid_1].gotit:false Prof RG Crespo Software de Telecomunicações Murphi : 36/38
Verificação (3) The following next states are obtained: Firing rule Initiator sends ciphered message, d:responderid_1, i:initiatorid_1 Obtained state: net{0}.mtype:m_inicipher net{0}.data:valid net{0}.source:initiatorid_1 Mensagem inserida na rede net{0}.dest:responderid_1 net{0}.key1:initiatorid_1 net{0}.key2:undefined ini[initiatorid_1].state:i_wait res[responderid_1].state:r_sleep res[responderid_1].deliver:undefined int[eavesdropperid_1].gotit:false Prof RG Crespo Software de Telecomunicações Murphi : 37/38 Verificação (4) Firing rule Initiator sends ciphered message, d:eavesdropperid_1, i:initiatorid_1 Obtained state: net{0}.mtype:m_inicipher net{0}.data:valid net{0}.source:initiatorid_1 net{0}.dest:eavesdropperid_1 net{0}.key1:initiatorid_1 net{0}.key2:undefined ini[initiatorid_1].state:i_wait res[responderid_1].state:r_sleep res[responderid_1].deliver:undefined int[eavesdropperid_1].gotit:false Prof RG Crespo Software de Telecomunicações Murphi : 38/38