2011年9月17日土曜日

Apache 2.2.21 リリース

Apacheの脆弱性(CVE-2011-3192)に対応した 2.2.20 からまもなく 2.2.21 がリリースされています。 2.2.20 で行った修正に対する改善や、新たにMaxRangesディレクティブの追加などが含まれている模様。 

そもそも問題となっている Range ヘッダは、ブラウザでPDFの閲覧をしている時などにも使用されています。
GET /net/apache//httpd/docs/httpd-docs-2.2.14.en.pdf HTTP/1.1
Accept: */*
Range: bytes=3653554-3854257, 1077245-3603942, 3608039-3653553
...

このヘッダを使用して、なぜプロセスの肥大化が引き起こされるのかについては下記のページで丁寧に説明されていて、Range で細かい区間を要求されることにより、管理データを追加していくループ処理の増加が原因とのこと。

  CVE-2011-3192 Range header DoS vulnerability Apache 1.3/2.x の更に続き

追加された MaxRanges ディレクティブ では、制限値(デフォルト: 200)を超えた場合、要求されたコンテンツをそのまま返すようになっています。区間要求が無視されることにより、プロセスの肥大化を防ぐ仕組みですね。
# vi httpd.conf
----------------------
# MaxRanges: Maximum number of Ranges in a request before
# returning the entire resource, or 0 for unlimited
# Default setting is to accept 200 Ranges
MaxRanges 5
----------------------

// 制限内の数を指定した場合
GET / HTTP/1.1
Host: localhost
Range: bytes=0-1,1-2,2-3,3-4,4-5 <= 一度に複数の範囲を指定

HTTP/1.1 206 Partial Content <= 206 レスポンスが返る
...
Accept-Ranges: bytes
Content-Length: 412
Content-Type: multipart/byteranges; boundary=4ad1ca44eeaa22

// 制限を超過した場合
GET / HTTP/1.1
Host: localhost
Range: bytes=0-1,1-2,2-3,3-4,4-5,5-6

HTTP/1.1 200 OK <= 要求されたコンテンツをそのまま返している
...
Accept-Ranges: bytes
Content-Length: 44
Content-Type: text/html

2011年9月1日木曜日

PyPy を試してみる

ときどき Project Euler の問題をしているのですが、そのまま書いてしまったため、結果の出力にすごく長い時間のかかるコードをふと PyPy で実行してみると、あまりの速度にびっくり。
#!/usr/bin/env python

result = 0
i = 20
while True:
    for num in range(1, 21):
        if not i % num == 0:
            break
    else:
        result = i
    if result:
        break
    i += 1
print result

$ time pypy problem5.py 
real    0m35.395s
user    0m34.910s
sys     0m0.090s

$ time python problem5.py 
real    5m19.202s
user    5m15.520s
sys     0m0.070s
テストではないけれど、PyPy のすごさを垣間見た気分。