VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

セキュリティー

脆弱性(vulnerability)トリビア

こんにちは, 株式会社ECナビ システム本部の春山(@haruyama)です.

セキュリティに関係する仕事をしていると, 「脆弱性」という言葉を聞かない日はありません. コンピュータセキュリティにおいては「脆弱性」とは, セキュリティ上の弱点という意味です. 「脆弱性」に関するニュースは毎日報じられています. 最近も, 「YouTube」にスクリプトを埋め込める脆弱性、現在では修正済み - ニュース:ITpro, Adobe Reader/Acrobatのアップデート公開、ゼロデイ脆弱性を修正 -INTERNET Watch などがニュースサイトで報じられています.

「脆弱性」は vulnerability という英語の訳です. 私が知っている vulnerability が 脆弱性と翻訳されたもっとも古い記録は, ロンドン海軍軍縮会議(1930年)です. 阿川弘之「山本五十六」で紹介されています. 新潮文庫「山本五十六」(上)三十三刷72ページから引用します(原文は縦書きです).

そして, 日本が「ナショナル・プレステージ」という言葉を持ち出すのに対し, 英国はしばしば「バルネラビリティ」という言葉を持ち出して議論した.
(略)
「バルネラビリティ」vulnerabilityという英語を, 溝田は「脆弱性」と訳したそうだが, それだけではちょっと通りが悪いかもしれない.
「バルネラビリティ」が大きいと英国側が言うのは, アキレスの踵がたくさんありすぎることである. 守備範囲が広すぎて, どこからでも刺されやすいという言葉である.

ここで出てくる「溝田」とは, 溝田主一という海軍の名通訳と言われた人です. 溝田主一がなぜ vulnerability を脆弱性と訳したかはわかりません. もともとそういう訳が先にあったのか, 彼が作った語なのか? もしご存知の方がいらっしゃったらブログのコメント覧や@haruyamaまでご連絡お願い致します.

原文には, この直後に「バルネラビリティ」についての記述があります. 「山本」は山本五十六です.

もっとも山本自身は, この言葉を生でよく理解出来たはずである. 何故なら, vulnerable というのはブリッジの勝負で終始使われる言葉であったから.

私はブリッジはやったことがないのですが, コントラクトブリッジでゲームを1度勝ったチームを、バルネラブル(バル)と呼ぶ。そうです.

以上, 「脆弱性」に関するトリビアでした.

RATSでPHPの利用すべきでない関数をチェック

こんにちは, 株式会社ECナビ システム本部 ECナビラボグループの春山(@haruyama)と申します.

私は, 主にセキュリティと検索をテーマに仕事をしています. 今回はセキュリティについてです.

先日, 他の言語については十分経験があるがPHPについてはあまり経験のない社員から,

「PHP (5.2) で使ってはいけない関数の一覧ってどこかにありませんか」と聞かれました.

PHPのセキュリティについては, PHP: セキュリティ - ManualPHP と Web アプリケーションのセキュリティについてのメモなどに資料があります.

また, PHP: PHP 5.3.x で推奨されない機能 - Manual に「推奨されない関数」という項目があります.

PHPのsplit() が推奨されないのは, split() がereg() などの POSIX 正規表現関数に属していて,

そして POSIX 正規表現関数 がバイナリセーフでなく速度も低速であるからです.

この知識はPHPの経験の浅い人が知ることは難しいでしょう.

そこでPHPのコードを静的に解析して問題のある関数の利用を抽出しようと考えました.

PHPの静的解析についてはあまり耳にしませんが, いくつかのツールがあります.

私は前職で, PHPLintという静的解析ツールに手を入れて, 問題のある関数への警告を出していました.

しかし, PHPLintは作者の独自のModula-2風の言語で書かれており, 改造しての利用は手軽ではありません.

そこで, RATS - Rough Auditing Tool for Securityを利用することにしました.

RATSは, c, c++, perl, php, python, rubyに対応した静的解析ツールです.

データベースファイル(xml)を自分で定義することで拡張することができます.

RATSはソースとWin32のバイナリが配布されています.

またDebianやUbuntuにはパッケージもあります.

ソースからのインストールは「./configure; make; make install」で可能です.

Win32のバイナリには, The Expat XML Parserのdllファイルをパスの通った場所に置く必要があります.

RATSのデフォルトのデータベースファイルには, PHPのsplit() についてのルールはありません.

データベースファイル(rats-php-split.xml)を次のように作成します (ファイルの文字エンコーディングやシェルのロケールがUTF-8の場合, 問題なく日本語文字が出力されました).

<VulnDB lang="php">
<Vulnerability>
<Name>split</Name>

<Info>
<Severity>High</Severity>
<Description>
split()はバイナリセーフではありません.
また, preg_split()よりも低速です.
preg_split()かexplode()を使用しましょう.
</Description>
</Info>

</Vulnerability>

</VulnDB>

次のsplit() を利用しているファイル(split_test.php)にRATSを適用すると, データベースファイルで指定した警告が出ます.

<?php
list($user, $pass, $uid, $gid, $extra) =
split(":", $passwd_line, 5);

% .../rats --db rats-php-split.xml split_test.php   
Entries in php database: 1
Analyzing split_test.php
split_test.php:3: High: split
split()はバイナリセーフではありません.
また, preg_split()よりも低速です.
preg_split()かexplode()を使用しましょう.

Total lines analyzed: 6
Total time 0.000074 seconds
81081 lines per second

警告を行なう関数の追加は, Vulnerability要素の追加で行なえます. rats-php-deprecated.xmlが私が作成したPHP: PHP 5.3.x で推奨されない機能 - Manualで挙げられている関数に対するデータベースファイルです.

ECナビでも, PHPを新たに始める人のコードや古いコードのチェックに利用していこうと考えています.

以上, RATSでPHPの利用すべきでない関数をチェックでした.

記事検索
QRコード
QRコード