2011年8月18日にリリースされたPHP 5.3.7にて、crypt関数に影響度の大きい問題が含まれていることが発覚されました。この記事では、どのような経緯でバグが含まれてしまったのかについて詳細に解説しています。
実際にバグが混入されたのはPHP 5.3.7 RC4からRC5になる際で、まさにリリース直前でバグが入ったことになります。具体的には文字列を連結させるstrcat関数の拡張版であるstrncat関数をstrlcat関数に変更したことでバグになってしまいました。strlcat関数はstrncat関数の代替として利用されるものであり、バッファオーバーフロー問題を回避できるメリットもあるため、一見問題ないように思えます。しかし、第3引数の意味が異なるため単純に関数名を置き換えただけでは問題が起きてしまい、今回はそれが原因で脆弱性を生むようになりました。
今回のバグを作ってしまったのはRasmus Lerdorf氏であり、彼はPHPの生みの親です。しかもテストコードは用意されており、テスト結果は失敗を示していました。PHPを作ったベテランのプログラマでさえ(テストコードや継続的インテグレーションを用意していたとしても)バグを防げなかったことには次の背景がありました。
- 静的コード解析ツールの警告に従い、そのまま修正してしまった
- リリースに影響しないテストやクリティカルでないバグが多くあり、普段から多くのテスト失敗があった
- 今回のバグに対するテスト失敗も、その他の失敗に紛れてしまい気づかなかった
Lerdorf氏は今回の問題を反省し、テスト失敗を見分けられるよう分類しなければならないと語っています。
URL:http://blog.tokumaru.org/2011/08/php537crypt.html