Kernel x Segurança. Rodrigo Rubira Branco. rodrigo@kernelhacking.com bsdaemon@bsdaemon.org. http://www.kernelhacking.com



Documentos relacionados
Kernel x Seguranҫa. Rodrigo Rubira Branco.

Dificuldades Reais na Migraçã. ção o para Software Livre

Sistemas Operacionais. Prof. Pedro Luís Antonelli Anhanguera Educacional

Backdoors x Firewalls de Aplicação Praticando em Kernel do Linux

2 SYSCALLs: O que são

Sistemas Operacionais

SISTEMAS OPERACIONAIS 2007

Sistemas Operacionais. Conceitos de um Sistema Operacional

SISTEMAS OPERACIONAIS

Estrutura, Processos e Threads

ADMINISTRAÇÃO DE SISTEMA OPERACIONAL DE REDE (AULA 1)

Aspectos de Sistemas Operativos

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

Introdução à Ciência da Computação

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Figura 01 Kernel de um Sistema Operacional

Sistemas Operacionais. Estruturas de SO. Edeyson Andrade Gomes.

6 - Gerência de Dispositivos

4 Estrutura do Sistema Operacional Kernel

UFRJ IM - DCC. Sistemas Operacionais I. Unidade IV Sistema de arquivos. Prof. Valeria M. Bastos Prof. Antonio Carlos Gay Thomé 13/06/2012 1

Sistemas Operacionais

Projeto: Camada Independente de Dispositivo

Sistemas Operacionais

Integração de Sistemas Embebidos MECom :: 5º ano

Unix: Sistema de Arquivos. Geraldo Braz Junior

Sistemas Operacionais

SO - Conceitos Básicos. Introdução ao Computador 2010/01 Renan Manola

Infra-Estrutura de Software. Introdução. (cont.)

Um Driver NDIS Para Interceptação de Datagramas IP

SISTEMAS OPERACIONAIS

Notas da Aula 15 - Fundamentos de Sistemas Operacionais

Sistema de Entrada/Saída

Sistemas Operacionais

SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar

Sistemas Operativos: Introdução. March 14, 2011

Funções de um SO. Gerência de processos Gerência de memória Gerência de Arquivos Gerência de I/O Sistema de Proteção

SISTEMAS OPERACIONAIS. Apostila 03 Estrutura do Sistema Operacional UNIBAN

Minicurso de Introdução a GNU/Linux. Nicolas Katte Dornelles Raul José Chaves Róbson Tolfo Segalla

Introdução. O que vimos. Infraestrutura de Software. (cont.) História dos Sistemas Operacionais. O que vimos 12/03/2012. Primeira geração:

ESTRUTURA DE UM SISTEMA OPERACIONAL

FACULDADE DE TECNOLOGIA SENAC PELOTAS CURSO TÉCNICO EM INFORMÁTICA PRONATEC PROFESSOR: NATANIEL VIEIRA ALUNOS: ANA CAROLINA, ROMÁRIO, WAGNER.

Sistemas Operacionais 3º bimestre. Dierone C.Foltran Jr.

Entradas/Saídas. Programação por espera activa Programação por interrupções

Software de segurança em redes para monitoração de pacotes em uma conexão TCP/IP

Sistemas Operacionais Aula 03: Estruturas dos SOs. Ezequiel R. Zorzal

Sistemas de Arquivos NTFS, FAT16, FAT32, EXT2 e EXT3

Introdução a Computação 07 Sistemas operacionais. Márcio Daniel Puntel marcio.puntel@ulbra.edu.br

Sistemas Operacionais. Roteiro. Hardware. Marcos Laureano

Sistemas Operacionais 2014 Introdução. Alexandre Augusto Giron

Introdução. Sistemas Operacionais

Sistemas Operacionais

Sistemas de Arquivos. Arquivos e Diretórios Características e Implementação Tadeu Ferreira Oliveira - tadeu.ferreira@ifrn.edu.br

Um retrospecto da aula passada... Um retrospecto da aula passada... Principais Aspectos de Sistemas Operacionais. Gerência de E/S

SOP - TADS Sistemas de Arquivos Cap 4 Tanenmbaum

SISTEMAS OPERACIONAIS

Resumo até aqui. Gerenciamento Proteção Compartilhamento. Infra-estrutura de Software

Aula 01 Visão Geral do Linux

Sistemas Operacionais

Sistemas Operacionais Entrada / Saída. Carlos Ferraz (cagf@cin.ufpe.br) Jorge Cavalcanti Fonsêca (jcbf@cin.ufpe.br)

10Pro Soluções em Tecnologia. Programar de novo: é investir novamente o que já foi investido em codificação...

Comandos Linux Comando tcpdump, guia de referência e introdução. Sobre este documento

Relatorio do trabalho pratico 2

Sistemas Operacionais Introdução

Sistemas Operacionais. Prof. M.Sc. Sérgio Teixeira. Aula 05 Estrutura e arquitetura do SO Parte 2. Cursos de Computação

Sistema Operacional Unidade 12 Comandos de Rede e Acesso Remoto

Modelos de Arquiteturas. Prof. Andrêza Leite

Arquitetura de Sistemas Operacionais Machado/Maia. Arquitetura de Sistemas

Aspectos de Segurança em Programação com Java

Máquina de estados UNIX O

Máquina de estados UNIX O. Sistemas Operacionais 2008/1Profa. Patricia S.O. computação: recursos D. S.O S.O. controla eventos no sistema de

Superioridade do Linux sobre Windows no quesito segurança

TempOS: faça seu próprio sistema operacional à mão, e do zero!

Ciclo de Vida de um Processo

Comunicação. Parte II

Sistemas Operacionais

Estrutura de um Sistema Linux Moderno Padrões de um Sistema Linux. Prof. Claudio Silva

Aula 02 Conceitos básicos elipse. INFORMÁTICA INDUSTRIAL II ENG1023 Profª. Letícia Chaves Fonseca

Algoritmos e Programação Estruturada

Guia de Conectividade Worldspan Go Res! A V A N Ç A D O

Manual de Configuração de Ambiente para Utilização do Login via Certificado Digital no Cadastro Web

11/3/2009. Software. Sistemas de Informação. Software. Software. A Construção de um programa de computador. A Construção de um programa de computador

Windows Device Drivers

Instalação de Sistemas

Sistemas de Arquivos. Arquivos Diretórios Implementação do sistema de arquivos Gerenciamento de espaço em disco

Manual do Desenvolvedor Criptografia de Arquivos do WebTA

Configurações de Firewall e DCOM no Windows 7 para aplicações Elipse.

Configurações de Firewall e DCOM no Windows 7 para aplicações Elipse.

Sistemas Operacionais de Rede. Configuração de Rede

ACL Linux. O que são ACLs e por que usá-las?

Sistemas Operacionais. Prof. André Y. Kusumoto

Gerência de Redes. Introdução.

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Arquitetura de Computadores. Introdução aos Sistemas Operacionais

Transcrição:

Kernel x Segurança Rodrigo Rubira Branco rodrigo@kernelhacking.com bsdaemon@bsdaemon.org

OBJETIVOS Demonstrar recursos existentes no kernel do Linux Explicar estruturas internas do kernel do Linux Explicitar possíveis melhorias de seguranca para o kernel Exemplificar recursos de segurança e de ataques Exemplificar recursos de módulos / injeção de código em kernel

GNU/Linux

STDLIB (Standard Library) Chamadas de sistema são os métodos utilizados por programas de usuário para pedirem aҫões do sistema operacional Esta chamada é efetuada através de um trap: Mudanҫa do modo usuário para modo kernel Controle dos parâmetros corretos Execuҫão efetuada pelo sistema operacional Retorno ao modo usuário Como é impossível executar um trap em C, este é provido pela standard lib através de funҫões para cada system call. Estas funҫões são escritas em ASM e então chamadas a partir do C. A stdlib define um conjunto de funҫões através das quais as aplicaҫões podem interagir com o kernel, e implementa muitas funcionalidades do sistema operacional que não necessitam da interaҫão do kernel O padrão POSIX estabelece quais são as funҫões da biblioteca que o sistema necessita providenciar, seus parâmetros e tarefas.

Kernel Responsável por manter as importantes abstraҫões do sistema operacional O kernel provê as principais funҫões da máquina abstrata (system calls, interrupҫões e traps). Estrutura Genérica de um Kernel Unix

Kernel O Kernel do Linux possui um modelo monolítico e não o novo modelo cliente servidor (ex: micro kernels, como minix). Isto por motivos de performance. O kernel é executado em modo kernel, com total controle aos recursos físicos do computador. Todo o código do kernel e os dados são mantidos em um único espaҫo de endereҫos. Embora o kernel execute como um simples processo em um único espaҫo de endereҫamento, este possui modularidade.

Problemas com a Seguranҫa Atual Evitar / Identificar / Corrigir O estado atual da seguranҫa é uma corrida sem fim Ciclo sem fim de descobrimento/correҫão de vulnerabilidades

Syscalls (chamadas ao sistema)

Syscalls (chamadas ao sistema)

Syscalls (chamadas ao sistema) extern void *sys_call_table[]; int (*o_getdents) (uint, struct dirent *, uint); o_getdents=sys_call_table[sys_getdents]; sys_call_table[sys_getdents]=(void*)h_getdents;

Syscalls (chamadas ao sistema) void *hacked_sys_call_table; hacked_sys_call_table=kmalloc(256*sizeof(long int), GFP_KERNEL); memcpy(hacked_sys_call_table, sys_call_table, 256*sizeof(long int)); (int)*((int*)ptr) =(int) hacked_sys_call_table; PTR aponta para o endereҫo original da tabela (chamada pela funҫão system_call)

VFS (Virtual File System) read() sys_read() ufs_read() disk_dev_read ()

VFS Exemplo de Hooks (chamadas /proc) Interceptando sem o uso das syscalls old_readdir_root = proc_root.file_ops >readdir; old_lookup_root = proc_root.inode_ops >lookup; proc_root.file_ops >readdir = &new_readdir_root; proc_root.inode_ops >lookup = &new_lookup_root;

VFS Security Mecanismos de seguranҫa impostos pelo VFS e alguns file systems: Mount flags (super_block s_flags) File attributes (inode i_mode) Extended attributes (Kernel 2.6) File ownership (inode u_uid) Restriҫões adicionais aos modelos existentes: Atributos extras ext2, ext3 Append Only, Immutable

VFS Fraquezas Um atacante que ganhe acesso root, possui completo controle sobre o sistema de arquivos Apagar entradas em logs Ext2 append only flag não impede o usuário root Insmod Checagens de seguranҫa do VFS/sistema de arquivos podem ser passadas Interceptando se chamadas de sistema ao VFS Substituindo se operaҫões nas tabelas linkadas na criaҫão de arquivos/inodes Comunicando se diretamente com o device driver (/dev)

Drivers de Dispositivos e Problemas de Seguranҫa Windows 2000: #1 em bugs de kernel reportados [Murphy 00] Os drivers não são controlados pelos Sistemas Operacionais, afetando e muito a seguranҫa dos mesmos Windows 2000 Other 3rd Party Kernel code 11% Drivers for HCL HW 7% Drivers for NonHCL HW 20% System Config 34% MSInternalCode 2% Other IFSDrivers 0% Anti Virus 4% HW Failure 22% Source: Brendan Murphy, Sample from PSS Incidents

Drivers de Dispositivos e Problemas de Seguranҫa Podemos aumentar a seguranҫa do SO através de tolerância de erros de drivers de dispositivos Necessita manter se compatibilidade com os drivers existentes Possível Soluҫão: Isolar os device drivers em uma sandbox, mantendo as APIs existentes

Drivers de Dispositivos e Problemas de Seguranҫa Performance do isolamento depende: Nível do isolamento requerido Custo das comunicaҫões entre isolamentos Custo das movimentaҫões de dados entre os isolamentos Custo da execuҫão do código isolado Problema: Necessita se conhecimento dos drivers antes de se isolar os mesmos.

Drivers de Dispositivos e Problemas de Seguranҫa Diferenҫas ao lidarmos com drivers: Já existem! Lidam com quantidade absurda de dados Possuem apelas recursos limitados de aplicaҫão

Drivers de Dispositivos e Problemas de Seguranҫa A maioria dos problemas em drivers são derivados de: [Chou 01, Linux kernel Bugzilla] Acesso ilegal a memória Uso inválido de locks Mantimento de interrupҫões desabilitadas Estes problemas podem ser detectados verificando se os acessos a memória e as condiҫões anteriores/posteriores na execuҫão do driver.

Drivers de Dispositivos e Problemas de Seguranҫa Kernel já suporta inicializaҫão/paralizaҫão de drivers dinamicamente Devido ao grande número de interfaces driver/kernel no Linux, temos muitas oportunidades de otimizaҫão: Muitos parâmetros read only Maioria das funҫões são de inicializaҫão/limpeza

TTY Sniffer handle_scancode user process put_queue sys_read receive_buf tty_driver flip buffer tty_read tty_ldisc buffer tty device

TTY Sniffer O modo comum de se desenvolver keyloggers para kernel é interceptar chamadas ao sistema read/write para armazenar as informaҫões passadas a estas Permite logar dados de todas as seҫões de usuários Diminui performance de todo o sistema Fácil de detectar (verificando se as syscalls)

TTY Sniffer Interceptaҫão: receive_buf receive_buf é chamada pelo driver de baixo nível do tty /* drivers/char/n_tty.c */ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) Para interceptar esta função, basta apontar tty_ldisc.receive_buf() A função hackiada tem como objetivo logar as entradas de usuário.

TTY Sniffer Exemplo int fd = open("/dev/tty0", O_RDONLY, 0); struct file *file = fget(fd); struct tty_struct *tty = file->private_data; o_receive_buf = tty->ldisc.receive_buf; tty->ldisc.receive_buf = h_receive_buf; void h_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { logdata(...); /* log inputs */ (*o_receive_buf)(tty, cp, fp, count); }

TTY Sniffer Problema tty_struct e tty_queue são dinamicamente alocadas > Necessária alguma forma para hookar dinâmicamente a funcao receive_buf() para o tty/pty quando invocada. Soluções Interceptar a syscall sys_open (vlogger 1.x THC) Interceptar a interface entre o drive de baixo nível do tty e as rotinas do driver de tty (chamada open()) (vlogger 2.x THC)

Network Hacks

Network Hacks

Network Hacks

Network Hacks

Técnicas de Hook de Rede ptype_* handlers Adicionar novo handler de protocolo, que pode reconhecer determinados pacotes ou modificar conteúdo de pacotes on the fly Netfilter hooks Adicionar novos hooks do NF, efetuando o mesmo que os handlers. Esta técnica também pode passar pelas regras locais de Firewall (ipfilter em Linux é implementado como um hook NF)

Protocol Handlers

Estrutura Utilizada: packet_type struct packet_type { unsigned short type; struct net_device *dev; int (*func) (...); void *data; struct list_head list; }; Funҫões exportadas pelo kernel para adicionar/remover handlers: void dev_add_pack(struct packet_type *pt) void dev_remove_pack(struct packet_type *pt)

Adiҫão do Handler struct packet_type myproto; myproto.type myproto.func myproto.dev myproto.data = = = = htons(eth_p_all); myfunc; NULL; NULL; dev_add_pack (&myproto)

Possível detectar? Listando todos os handlers de protocolo suportados? Checagem manual das listas: ptype_all ptype_base Não são exportadas pelo kernel (mesmo método que usado para exportar sys_call_table em kernel 2.6)

Definiҫão das listas de protocolos? Variáveis globais do kernel (net/core/dev.c): static struct packet_type *ptype_base[16]; static struct packet_type *ptype_all = NULL; Funҫões com endereҫos conhecidos: Kernel 2.4.20 Kernel 2.6.7 1. dev_add_pack() 1. dev_add_pack() 2. dev_remove_pack() 2. dev_remove_pack() 3. 4. dev_queue_xmit_nit() netif_receive_skb() 3. dev_queue_xmit_nit() 4. netif_receive_skb() 5. net_dev_init() Funҫões em VERDE são exportadas

Estrutura do Netfilter

Estrutura do Netfilter

Estrutura Utilizada: nf_hook_ops struct nf_hook_ops { struct list_head list; nf_hookfn *hook; handler address int pf; family (AF_INET, AF_INET6, AF_IPX,...) int hooknum; (NF_IP_*, NF_IP6_*, NF_IPX_*,...) int priority; }; Funҫões exportadas pelo kernel para adicionar hooks NF: int nf_register_hook(struct nf_hook_ops *reg); void nf_unregister_hook(struct nf_hook_ops *reg);

Listas de Hooks NF Registradas struct list_head nf_hooks[nproto][nf_max_hooks]; AF_UNSPEC (0) AF_UNIX (1) AF_INET (2) AF_AX25 (3) AF_IPX (4) AF_APPLETALK(5) NF_IP_PRE_ROUTING (0) NF_IP_LOCAL_IN (1) NF_IP_FORWARD (2) NF_IP_LOCAL_OUT (3) NF_IP_POST_ROUTING(4)

Possível detectar? O endereҫo de nf_hooks é exportado Sabendo tal endereҫo, apenas precisamos verificar toda a lista e encontrar hooks suspeitos Lê se suspeito como, por exemplo: Hooks que não pertenҫam a módulos existentes Módulos que foram escondidos Módulos que não limparam seus hooks ao serem descarregados Código injetado via /dev/(k)mem

Agradecimentos - Eventos, Workshops, Seminários, Palestras, RoadShows, Conversas - Comunicação - Elo mais fraco da segurança da informação

FIM! Será mesmo? DÚVIDAS? Rodrigo Rubira Branco rodrigo@kernelhacking.com bsdaemon@bsdaemon.org