Meniu

Stoparea abuzului functiei PHP mail()

De mult ne confruntam cu o problema. Spamerii. O metoda folosita de ei - cumpara hosting, la preturi mici, sau chiar gratuit, si folosesc platforma hosterului pentru a trimite spam.

Daca il trimit standard, folosind un client mail, ii prindeam rapid, deoarece pe sistemele respective nu se permite relaying fara autorizare, si analizand logul mail serverului, imi dadeam seama foarte usor.

Alta varianta - cgi scripturi. La fel se gasesc foarte usor, deoarece rulam cgi-urile cu suexec. Cel mai greu imi era sa-i gasesc, atunci cand trimiteau e-mail-urile din scripturi php, folosind functia mail().

Php scripturile erau rulate de catre userul apache/nobody. Nu-mi permiteam luxul de a rula php scripturile cu suexec, din mai multe motive - incomoditate pentru useri, scaderea performantei sistemului.

Urmatorul wrapper:

_____________ COD BEGIN ________________
#!/usr/bin/perl
# grisha /grisha at unixro.net/
# catam /cgm at prohosters.com/
#
use POSIX;
if($> != 0 ) {
my $cwd = getcwd;
my $date = `date`;
chomp $date;
my $rest;
if($ENV{'SCRIPT_FILENAME'}) {
$rest = " $ENV{'SCRIPT_FILENAME'}";
}
if(open (INFO, ">>/var/log/phpmail.log")) {
print INFO "$date $>:$cwd$rest ";
close INFO;
}
}
exec {"/usr/sbin/sendmail"} ('/usr/bin/sendmail',@ARGV);
______________ COD END ______________

Redactam fisierul php.ini (poate fi intr-o multime de locatii, enumar cateva :

/usr/local/lib/php.ini
/etc/php.ini
/etc/httpd/conf/php.ini
etc )

Gasim linia sendmail_path = /usr/sbin/sendmail -t -i, si o modificam in sendmail_path = /usr/bin/sendmail -t -i (chiar uitandu-se in output-ul unui phpinfo(), foarte putini vor observa diferenta :)

Salvam wrapperul de mai sus, in /usr/bin/sendmail, atribuim permisie de executie acestui fisier:

[root@cp8 tmp]# chmod +x /usr/bin/sendmail

Cream un fisier gol /var/log/phpmail.log

[root@cp8 tmp]# touch /var/log/phpmail.log

si ii atribuim permisiile corespunzatoare:

[root@cp8 tmp]# chown nobody.nobody /var/log/phpmail.log

(userul care ruleaza scripturile php, nobody, apache, www-data, etc)

[root@cp8 tmp]# chmod 600 /var/log/phpmail.log

Cu setarile de pana acum, oricine poate , fara prea multa silinta, sterge/modifica acest log, cu un script ce ruleaza sub userul nobody ( nu uitati sa opriti functiile exec,system,passthru din php, in php.ini, exemplu: disable_functions=exec,system,passthru )

Pentru cresterea securitatii, adaugam atributul +a fisierlui jurnal respectiv.

[root@cp8 tmp]# chattr +a /var/log/phpmail.log

Nimeni, nici chiar root nu va putea sterge/redacta acest fisier, atat timp cat are atributul +a (append only, fisierul dat va putea fi deschis doar pentru adaugarea datelor, nu si stergerea/modificarea).

O alta problema - fisierul dat poate atinge dimensiuni impresionante. In cazul asta, modificam logrotate.conf corespunzator, ca inainte de rotarea jurnaluilui dat, atributul append-only sa fie scos, si apoi adaugat din nou).

Ramana o singura problema. Oricine care capata drepturile userului ce ruleaza apache, ne poate compromite sistemul printr-un simplu

dd if=/dev/zero of=/var/log/phpmail.log

Solutia - quota pentru userul apache pe aceasta partitie. Quota mare, dar suficienta pentru a preveni o compromitere a sistemului de catre rauvoitori.
In exemplul meu -
/dev/hda3 7.7G 1019M 6.4G 14% /var
mountata cu parametrii
/dev/hda3 on /var type ext3 (rw,nosuid,nodev,noexec,usrquota)

Am setat quota la 500 Mb

[root@cp8 tmp]# setquota -u nobody 500000 500000 0 0 /var

Acum, cand cineva va trimite un mail prin functia mail() dintr-un script php, in /var/log/phpmail.log , veti avea ceva de genul:

Mon Jun 21 04:15:13 EEST 2004 - /home/domeniu.com - nobody x 99 99 Nobody / /sbin/nologin

O alta posibilitate de a trimite spam folosind php, este accesarea /usr/sbin/sendmail direct, cu functiapopen(), sau folosind sockets.

Sper sa fie de folos. Astept sugestii.

Andreea

"Rome wasn't built in a day" !
  • | 120 articole

Nici un comentariu inca. Fii primul!
  • powered by Verysign