Personal tools
You are here: Home ブログ 井上 こんな所に桁あふれの問題が潜んでいるとは
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
Categories
カテゴリなし
 
Document Actions

こんな所に桁あふれの問題が潜んでいるとは

APRのセキュリティパッチです(Apache httpdには影響ありません。当然、AirOneも大丈夫です)。

バグの元凶は次のマクロです。

/* APR_ALIGN() is only to be used to align on a power of 2 boundary */
#define APR_ALIGN(size, boundary) \
   (((size) + ((boundary) - 1)) & ~((boundary) - 1))

マクロの意図は、第1引数のsize以上かつboundaryの倍数を返すことです。実例の方が分かりやすいので、boundaryを8にして次のコードを動かしてみます。

#include <stdio.h>
int main()
{
    unsigned int i;
    for (i = 0; i < 24; i++) {
        printf("%u %u\n", i, APR_ALIGN(i, 8));
    }
    return 0;
}

結果は次のようになります。

0 0
1 8
2 8
3 8
4 8
5 8
6 8
7 8
8 8
9 16
10 16
11 16
12 16
13 16
14 16
15 16
16 16
17 24
18 24
19 24
20 24
21 24
22 24
23 24

第1引数(size)を入力、マクロの結果を出力と思えば意図は自明だと思います。普通に見ていると、出力は入力以上の数値になりそうです。しかし、セキュリティパッチは、出力が入力(size)より小さくなることがあることを示唆しています。

上のコードのループを次のように変更してみます。

for (i = 0; i < ~0; i++) {
    if (i > APR_ALIGN(i, 8)) {
        printf("%u %u\n", i, APR_ALIGN(i, 8));
    }
}

動かすと次のようになります。

4294967289 0
4294967290 0
4294967291 0
4294967292 0
4294967293 0
4294967294 0

実際に言われてみれば、という感じですが、Apacheのソースコードは相当数の目に晒されてきたはずなのに誰も気づきませんでした。

ここで注目したいのがqmailです。

似た目的のマクロを持っていますが、次のようにしっかりとオーバーフローの可能性を明記しています。さすがdjb、ひとりでASFを越えています。

n = ALIGNMENT + n - (n & (ALIGNMENT - 1)); /* XXX: could overflow */
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/overflow/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.