新・闘わないプログラマ No.217

オーバフロー


先週、SNMPに関するセキュリティホールに関する警告がありまして、私自身もSNMPについては、仕事でいろいろ取り扱った関係上、あちこち調べている最中です。物によってはパッチも当てないといけないかなあ、と思っているわけでして。とは言うものの、外部からSNMPで直接攻撃されるような場合というのは、実はそれほど無いと言うか、そもそも外部からSNMPのリクエストを受け付ける必要性って特に思い当たらないので(中にはそういう必要性があるものもあるのでしょうか?)、外部からのリクエストを禁止しているようなら、非常に危険というほどでもないかとは思います。

そもそもSNMP(Simple Network Management Protocol)とは何か、ということなのですが、簡単に言ってしまえば、TCP/IP上のネットワーク管理のプロトコルということになります。さまざまなネットワーク機器を一括管理しよう、とかそういう場合によく使われているプロトコルです。ここで、管理する側を「マネージャ」、管理されるさまざまなネットワーク機器を「エージェント」などと呼びます。
マネージャはエージェントに対して、そのエージェントの状態(CPUやメモリの使用率とか、ネットワークの統計情報とか、他にもたくさんの情報があって、これらの全体をMIB:Management Information Baseと呼んでいます)の情報を要求したり、エージェントの状態の変更要求を出したり出来ます。逆に、エージェントはマネージャに対して、障害等の何らかの状況が発生したことを通知することも可能です。
とにかくこんな感じでマネージャとエージェントの間で情報のやり取りをするときに使われるプロトコルがSNMPですが、このSNMPのエージェント機能は、コンピュータ(UNIXやWindowsや…)以外にも、ルータやハブと言ったネットワーク機器などにも実装されています。まあ、主に家庭用の安物のネットワーク機器には実装されていないものもありますが。
さて、このSNMPエージェントは、マネージャからの要求のみを受け付ければいいわけでして、不特定多数のホストからの要求を受け付ける必要は無いわけですが、(今はどうか知りませんけど)少し前のOSやネットワーク機器に実装されているSNMPエージェントは、初期状態ですべてのホスト(IPアドレス)からの要求を受け付けるようになっているものが大半でした(←というか、私はそういうのしか見たことが無い)。しかもSNMPのコミュニティ名と呼ばれる、まあ一種のパスワードみたいなもの(ちょっと違うか?)も、初期状態では「public」という最も一般的な名前になっていたりして、セキュリティ的にはなにも考えていなかったのでは、と思わせるものがあります。
一昔前は、こんな丸裸の状態のネットワーク機器が、外部からの攻撃の可能性のある場所に結構設置されていたのを見かけたことがありまして、何と言いますがおおらかな時代だったなあ、ということで。
というわけで、今ならどこでも外部からのSNMPのリクエストははじいているのではないか、と思うのですがどんなもんでしょう?

あれれ、今回は別にこんな話をしようと思っていたわけではないのですが、大幅に話がそれてしまいました。
話を戻しまして、今回警告があったSNMPのセキュリティホールってのは、別に上に書いたような設定上の穴によるものでは無くて、SNMPエージェントに不正なリクエストを送ると、それに伴ってバッファオーバフロー等の障害をエージェントに発生させる危険性が高い、ということのようです。それも、特定のOSや機器というわけではなくて、かなりのOS・機器に渡って問題になる、ということみたいです。
バッファオーバフローが発生すると、下手すると(うまくすると?)任意のプログラムを動かせちゃったりするわけで、root権限で動いていることが多いSNMPエージェントから、なんでもプログラムが動かせると非常に危険なわけです。

そもそも、「バッファオーバフロー」って、セキュリティホールとしては非常によくありがちなものですけど、プログラミングの経験の無い人にとっては「なんでそんなにバッファオーバフローなんてセキュリティホールがボコボコ見つかるんだ? プログラマはいったい何をやってるんだ!」と思われるみたいです。私も何度か聞かれたことがありますし。
いやまあ、コレ、言い訳するわけじゃないですけど、バッファオーバフローの可能性を100%潰したプログラムって、書くのが大変面倒なんですよね。でもって、たいがい手を抜いちゃう。「まあ、こんくらいの大きさのバッファを用意しておけば、多分収まるよな。そんな馬鹿でかいデータを入れるなんてことはまさか誰もやらんだろうし」とかなんとか。
いやね、分かってはいるんですよ。バッファに入りきらないデータの可能性もあるんだったら、その場合でもうまく動くようにバッファを自動的に拡張するようプログラミングするとか、それが出来ないなら、せめてエラーメッセージを出して終了するようにするとか。でも、特にCなんかでプログラミングしていると、面倒なもんだから、配列のサイズを考慮せずにいきなりstrcpyしたりとかして、後ろを壊しちゃうんですよね。
でも、ホント言い訳するわけじゃないけど、そういうプログラムは世間にいっぱいありまして、ほら、Windowsなんか使っていると、よく「不正な処理を〜云々」って出るでしょ? アレですよ、アレ。あれの多くはそんなやつだったりするわけでして、私だけが悪いわけじゃ…。

あれれ?「言い訳するわけじゃないけど」と言いつつ、言い訳しかしなかったような…。まあ、細かいことは気にしないで…ってダメですか?

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp