DoS w nginx
Arkadiusz Patyk
areq w pld-linux.org
Wto, 18 Wrz 2007, 23:46:41 CEST
Hej
Chyba wykryłem Dos w nginx. Poproszę o weryfikację ;)
Konfiguracja:
server {
listen 10.9.31.6:80;
server_name pld.areq.eu.org;
access_log /var/log/nginx//pld.access.log;
location / {
root /vol/mirror/ftp.pld-linux.org;
autoindex on;
}
}
# ls /vol/mirror/ftp.pld-linux.org
dists
Virtual powyższy to lokalny mój mirror ftp PLD. Co jakiś czas nginx
zdycha wyrzucając 500. Restart pomagał. Okazało się powodem jest
too many open files.
Wykonanie HEAD na katalogu powduje otwarcie go przez nginx
i nie zamknięcie ;(
echo -e "HEAD / HTTP/1.1\r\nHost: pld.areq.eu.org\r\n\r\n" | nc
10.9.31.6 80
lsof:
nginx 10066 nginx 21r DIR 9,0 18 402653312
/vol/mirror/ftp.pld-linux.org
nginx 10066 nginx 22r DIR 9,0 18 402653312
/vol/mirror/ftp.pld-linux.org
po kazdym HEAD przybywa i zostaje otwarty taki plik i tak aż do
wyczerpania limitu.
strace:
epoll_wait(20,
{{EPOLLIN, {u32=135133300, u64=4430100596}}}, 512, -1) = 1
gettimeofday({1190147846, 304732}, NULL) = 0
accept(16, {sa_family=AF_INET, sin_port=htons(1581),
sin_addr=inet_addr("10.9.8.100")}, [16]) = 18
ioctl(18, FIONBIO, [1]) = 0
epoll_ctl(20, EPOLL_CTL_ADD, 18, {EPOLLIN|EPOLLET, {u32=135133552,
u64=13807009823030376816}}) = 0
epoll_wait(20, {{EPOLLIN, {u32=135133552, u64=13807009823030376816}}},
512, 60000) = 1
gettimeofday({1190147846, 305917}, NULL) = 0
recv(18, "HEAD / HTTP/1.1\r\nHost: pld.areq"..., 1024, 0) = 42
open("/vol/mirror/ftp.pld-linux.org/index.html", O_RDONLY|O_LARGEFILE)
= -1 ENOENT (No such file or directory)
stat64("/vol/mirror/ftp.pld-linux.org", {st_mode=S_IFDIR|0755,
st_size=18, ...}) = 0
open("/vol/mirror/ftp.pld-linux.org",
O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 25
fstat64(25, {st_mode=S_IFDIR|0755, st_size=18, ...}) = 0
fcntl64(25, F_SETFD, FD_CLOEXEC) = 0
writev(18, [{"HTTP/1.1 200 OK\r\nServer: nginx/0"..., 155}], 1) = 155
write(7, "10.9.8.100 - - [18/Sep/2007:22:3"..., 76) = 76
recv(18, "", 982, 0) = 0
write(7, "10.9.8.100 - - [18/Sep/2007:22:3"..., 62) = 62
close(18) = 0
epoll_wait(20,
Problem nie występuje przy autoindex off
Pozdrawiam,
--
Arkadiusz Patyk [areq<>pld-linux:org] [http://rescuecd.pld-linux.org/]
[IRC:areq skype:arekpatyk GG:1383 jid:arek<>patyk:net]
Więcej informacji o liście dyskusyjnej pld-devel-pl