
Isso me deixou um pouco preocupado: estou usandoaflitopara monitorar um servidor CentOS 6 em busca de alterações em arquivos e diretórios. Quero detectar alterações em arquivos binários, scripts PHP que estão sendo contrabandeados para o servidor, arquivos de configuração que mudam, etc. Isso é executado diariamente e recebo um email com as alterações detectadas. Normalmente, ele contém apenas arquivos de log e alterações após atualizar meu código da web ou instalar um novo software. Hoje parecia que tirei a sorte grande, mas não tenho certeza.
Recebi um e-mail informando que a soma de verificação MD5 de centenas de arquivos foi alterada, mas não seu carimbo de data/hora ou tamanho. Isso inclui executáveis como, /bin/gawk
mas também bibliotecas como /lib/libasound.so.2.0.0
. Tudo isso aconteceu entre 4h do dia 1º de janeiro e 4h do dia 2 de janeiro (afick é executado às 4h).
Como teste, restaurei /bin/gawk do backup e executei uma soma de verificação md5 manual; na verdade, o arquivo foi alterado. Mas uma diferença entre os dois binários é um tanto inconclusiva:
--- old.gawk.hex 2017-01-02 15:56:06.000000000 +0100
+++ new.gawk.hex 2017-01-02 15:56:14.000000000 +0100
@@ -881,12 +881,12 @@
00003700 a6 03 00 00 00 00 00 00 d1 04 00 00 12 00 0d 00 |................|
00003710 f0 6d 42 00 00 00 00 00 2a 10 00 00 00 00 00 00 |.mB.....*.......|
00003720 01 00 00 00 b0 6b 5a 56 65 fd 1b 6d 00 00 00 00 |.....kZVe..m....|
-00003730 00 00 00 00 44 00 00 00 b0 6b 5a 56 b2 04 c4 e2 |....D....kZV....|
+00003730 00 00 00 00 44 00 00 00 56 e5 5d 58 82 a0 c7 cf |....D...V.]X....|
00003740 00 00 00 00 00 00 00 00 62 00 00 00 b0 6b 5a 56 |........b....kZV|
00003750 58 97 65 11 00 00 00 00 00 00 00 00 97 10 00 00 |X.e.............|
00003760 b0 6b 5a 56 30 fb 60 86 00 00 00 00 00 00 00 00 |.kZV0.`.........|
00003770 b0 2f 40 83 34 00 00 00 01 00 00 00 00 00 00 00 |./@.4...........|
-00003780 e0 08 65 00 00 00 00 00 e0 1f c8 83 34 00 00 00 |..e.........4...|
+00003780 e0 08 65 00 00 00 00 00 e0 1f 88 0a 35 00 00 00 |..e.........5...|
00003790 01 00 00 00 00 00 00 00 08 09 65 00 00 00 00 00 |..........e.....|
000037a0 50 2d 15 83 34 00 00 00 01 00 00 00 00 00 00 00 |P-..4...........|
000037b0 d0 ff ff ff ff ff ff ff 58 2d 15 83 34 00 00 00 |........X-..4...|
@@ -19806,13 +19806,13 @@
*
000501e0 28 00 65 00 00 00 00 00 1e 59 40 00 00 00 00 00 |(.e......Y@.....|
000501f0 00 00 00 00 00 00 00 00 00 b1 e8 82 34 00 00 00 |............4...|
-00050200 10 cd ec 82 34 00 00 00 50 32 a2 83 34 00 00 00 |....4...P2..4...|
-00050210 80 79 e6 82 34 00 00 00 e0 2f a2 83 34 00 00 00 |.y..4..../..4...|
+00050200 10 cd ec 82 34 00 00 00 50 32 62 0a 35 00 00 00 |....4...P2b.5...|
+00050210 80 79 e6 82 34 00 00 00 e0 2f 62 0a 35 00 00 00 |.y..4..../b.5...|
00050220 20 87 e7 82 34 00 00 00 20 bc e8 82 34 00 00 00 | ...4... ...4...|
00050230 20 9f e7 82 34 00 00 00 b0 05 e8 82 34 00 00 00 | ...4.......4...|
00050240 d0 af e9 82 34 00 00 00 20 5e ed 82 34 00 00 00 |....4... ^..4...|
00050250 40 7e ee 82 34 00 00 00 40 71 ec 82 34 00 00 00 |@[email protected]...|
-00050260 10 9d e9 82 34 00 00 00 30 6f a1 83 34 00 00 00 |....4...0o..4...|
+00050260 10 9d e9 82 34 00 00 00 30 6f 61 0a 35 00 00 00 |....4...0oa.5...|
00050270 f0 d7 ec 82 34 00 00 00 60 19 e3 82 34 00 00 00 |....4...`...4...|
00050280 e0 b1 e9 82 34 00 00 00 10 85 ee 82 34 00 00 00 |....4.......4...|
00050290 30 84 ec 82 34 00 00 00 40 20 e6 82 34 00 00 00 |0...4...@ ..4...|
(etc)
Claro, meu primeiro pensamento foi hackear, mas ver a diferença me faz pensar. Nenhum código real parece ter mudado; Não sou especialista em binários ELF, mas acho que são apenas tabelas de deslocamento de realocação para bibliotecas compartilhadas.
Então, o que você acha que realmente aconteceu? Além de hackear, a única outra possibilidade que consigo pensar é uma medida de 'segurança' em que as compensações da biblioteca compartilhada são aleatórias e os binários vinculados também devem ser atualizados. Mas por que agora? A última vez que instalei algum software foi em 23 de dezembro e nada de estranho apareceu no meio. O único cronjob que pode estar relacionado é /etc/cron.daily/prelink, mas se sim, por que agora?
Responder1
A diferença nas somas de verificação binárias que você descreveu provavelmente se deve à pré-vinculação. Distribuições Linux baseadas em RHEL, como CentOS e Fedora, têm pré-linking habilitado por padrão. Veja como um 2009Artigo LWN.netexplica o conceito por trás do pré-link:
Os programas Linux normalmente consistem em um arquivo executável binário que se refere a várias bibliotecas compartilhadas. Essas bibliotecas são carregadas na memória uma vez e compartilhadas por vários executáveis. Para que isso aconteça, o vinculador dinâmico (ou seja, ld.so) precisa alterar o binário na memória de forma que quaisquer endereços dos objetos da biblioteca apontem para o lugar certo na memória. Para aplicativos com muitas bibliotecas compartilhadas (programas GUI, por exemplo), esse processo pode levar algum tempo.
A ideia por trás da pré-vinculação é bastante simples: reduzir a quantidade de tempo que o vinculador dinâmico precisa gastar fazendo essas realocações de endereço, fazendo isso com antecedência e armazenando os resultados. O programa de pré-link processa binários ELF e bibliotecas compartilhadas da mesma maneira que o ld.so faria e, em seguida, adiciona seções ELF especiais aos arquivos que descrevem as realocações. Quando ld.so carrega um binário ou biblioteca pré-vinculado, ele verifica essas seções e, se as bibliotecas forem carregadas no local esperado e a biblioteca não tiver sido alterada, ele poderá fazer seu trabalho muito mais rapidamente.
No entanto, se as bibliotecas são sempre carregadas no mesmo local de memória, os invasores podem tentar atingir esses locais com código malicioso, e é por isso que as distros Redhat são executadas prelink
regularmente com a -R
opção (para obter a randomização do layout do espaço de endereço). Uma consequência da alteração dos locais de memória é que a soma de verificação dos arquivos binários executáveis será alterada. Portanto, se você estiver usando um verificador de integridade de arquivo como o AIDE, você será alertado sobre um binário "alterado" quando na verdade a única alteração que ocorreu foi ASLR via prelink -R
.
Referências: https://en.wikipedia.org/wiki/Prelink#Linux