Kids 0.1b released

It is my great pleasure to announce the availability of KIDS 0.1b, an Kernel (Network) Intrusion Detection System. This project is the result of a year of research on kernel and Network IDS. The Kernel Intrusion Detection System-KIDS, is a Network IDS, where the main part, packets grab/string match, is running at kernelspace, with a hook of Netfilter Framework. This project is not ready for use. It is only a proof of concept and should not be put in an environment in production, yet.

The main goal of KIDS is to try to reduce the delay in the processing of the rules, with the elimination of two changes in context (kernel-user-user-kernel), as this task is performed in kernelspace.

The main goal of KIDS is to try to reduce the delay in the processing of the rules, with the elimination of two changes in context (kernel-user-user-kernel), as this task is performed in kernelspace.

Very thanks to Amador Pahim, my boss and Teacher Advisor.

A more detailed document for development / hacking will be drafted later.

For more information about KIDS project, please see:

http://sourceforge.net/projects/ids-kids/

Oops

Quem disse que o Linux não trava ?? Que atire a primeira pedra quem nunca viu ao menos um kernel panic na tela ? Pois bem, quando um erro grave ocorre no sistema, entre outras coisas que o kernel faz uma delas é exibir no terminal e/ou sistema de log, uma mensagem bastante conhecida por quem já passou por isso, a famosa mensagem de Oops. Trata-se de um dump do estado do CPU e da pillha do Kernel no momento em que o problema ocorreu. A mensagem de Oops mais conhecida é a que vem acompanhada de um kernel panic. Muitos ao se deparar com isso, percebem que nada funciona (na maioria dos casos), Ctrl+Alt+Backspace, teclas de função, e nem água, ai, simplesmente reiniciam a máquina, podendo causar ainda mais problemas.

Abaixo um exemplo de uma mensagem de Oops:

Unable to handle kernel paging request at virtual address 00010015
 printing eip:
c01e6608
*pde = 00000000
Oops: 0000
CPU:    0
EIP:    0010:[usb_unlink_urb+8/64]    Tainted: P
EFLAGS: 00010202
eax: 00010001   ebx: d70c6494   ecx: c7c81000   edx: 00010001
esi: c7c81640   edi: d70c6400   ebp: d70c64f0   esp: d2daded0
ds: 0018   es: 0018   ss: 0018
Process kpilotDaemon (pid: 30778, stackpage=d2dad000)
Stack: d892a2ed 00010001 d70c6494 d70c6400 d3df51c0 00000000 d8924350 d70c6494
       d3df51c0 d725a000 cc5faa40 c16063c0 c018c460 d725a000 d3df51c0 d3df51c0
       cc5faa40 c16063c0 c8117e40 00000001 d3df51c0 bffff0e8 00000000 00000000
Call Trace: [] [] [release_dev+576/1280]
[n_tty_ioctl+257/1200] [tty_release+10/16]
   [fput+76/224] [filp_close+92/112] [sys_close+67/96] [system_call+51/56] 

Code: 8b 42 14 85 c0 74 21 8b 80 bc 00 00 00 85 c0 74 17 8b 40 18

Esta mensagem pode ajudar aos desenvolvedores do kernel a depurar melhor o problema, e mesmo que você não reporte o bug, você pode se utilizar de um recurso que foi desenvolvido pensando nisto: As Magic SysRq Keys.

Trata-se de uma combinação de teclas que é utilizada para comunicar-se com o kernel do Linux, caso a opção CONFIG_MAGIC_SYSRQ tiver sido habilitada durante a compilação do kernel, ou em /proc/sys/kernel/sysrq.

Basta apertar Alt+PrintScreen+Tecla e a saída (dependendo da tecla) é enviada para o dmesg. Abaixo apenas algumas teclas:

Tecla Descrição
t Lista de tarefas/processos com suas informações detalhadas
u Remonta todas as partições montadas, só que em read-only
m Mostra informações sobre o estado atual da memória
e Envia um sinal do tipo SIGTERM para todos os processos, exceto para o init

Existe a famosa combinação: Alt+PrintScreen+R E I S U B, onde basicamente mata todos os processos, sincroniza os discos, remonta todas os filesystems montados em read-only, e só então reinicia a máquina. Por tanto, antes de "meter o dedão" no botão de power, REISUB. :)

KIDS na Argentina

Para quem não sabe, estou trabalhando em um projeto desde do início deste ano, chamado Kernel Intrusion Detection System - KIDS, este projeto visa o desenvolvimento de, entre outras partes, um módulo para o kernel 2.6 que fará a parte principal de um Network IDS, a captura e análise dos pacotes de redes, tentando com isso obter um melhor desempenho, que as aplicações que utilizam a libpcap. Este projeto não tem por objetivo "concorrer" com os NIDS já existentes, é apenas uma prova de conceito, porém o módulo que faz a captura dos pacotes, pode muito bem ser utilizada por estes IDSs, já que está sob GPL.

Pois bem, de 7 à 11 de Agosto, acontecerá em Córdoba, na Argentina 7a. Jornadas Regionales de Software Libre, e estarei lá pela primeira vez apresentando o KIDS para que outros desenvolvedores possam conhecer e opinar/ajudar com este projeto. Nunca fui a este evento, mas as expectativas são as melhores, o evento tem um porte grande e terá convidados como Christoph Hellwig, Jonas Öberg e outros que podem ser consultados aqui. O evento terá aproximadamente, até o momento, 100 palestras dividas nos macro-temas: Sociedade, Técnica e Empresa. Portanto, amigos argentinos, nos veremos en breve.

Buumm…

Trechos de código maliciosos que tem por objetivo a negação de um serviço ou até mesmo a obtenção de um recurso privilegiado do sistema, a internet tá cheia. Muitos já vi, mas um deles me chamou a atenção quando me deparei com ele pela primeira vez, foi um simples fork bomb, feito em meia linha, utilizando a bash. Reparem como é "medonho" o danado:

$ :( ){ :| :; };:

Simples, não ? Tirando o fato desta linha poder travar uma máquina em poucos segundos, é uma função como outra qualquer, que em uma primeira olhada, pode parecer um palavrão, mas acreditem, não é. Obfuscated Code é uma boa leitura. Explicando melhor, uma função em script bash, pode ser declarada da seguinte forma:

$ teste() {
> echo "teste";
> }

Ok, tranquilo... Mas esta mesma função pode fazer referência à ela mesmo (Recursividade), bastava que no local de um echo, tivesse a própria função, e caso ela chamasse a si próprio usando um pipe para ela também, ai é que "num tinha pareia não", como diriam os natalenses amigos meus. Observe:

$ teste() {
> teste | teste ;
> }

Substituindo teste por dois pontos (apenas mudamos o nome da função), e logo em seguida chamamos a tal função, tudo junto, em uma linha só, temos a bomba shell:

$ :( ){ :| :; };:

Existem várias maneiras de preparar Neston, e também existem várias maneiras de se proteger de um uso exagerado de recursos, a mais flexível talvez seja utilizando a ferramenta ulimit, que não serve apenas para especificar a quantidade de processos que um usuário pode alocar, man ulimit e seja feliz.