どさにっき 〜2017年5月上旬〜

by やまや
<< = >>

2017年5月8日(月)

exim で php のメール送信でコード実行される件。

_ 昨年末から続いている PHP でメール送信するところでリモートからコード実行できちゃう一連の脆弱性の話。これまでは主に sendmail がターゲットだったけど、 PHPMailerの脆弱性CVE-2016-10033はExim4やWordPress4.6でも影響があった という話が。Host ヘッダからコード注入するとか何を食ったらそんな発想に至るのかまったく想像の埒外なんだけど世の中いろんなこと考える人いるなぁ。ちなみに Host ヘッダの細工で、コード実行以外にも wordpress に認証なしでパスワードリセット要求もできるらしいよ。

_ で、これとは別件なんだけど、やっぱり PHP のメール送信でコード実行される脆弱性が先月 Squirrelmail に見つかってる。解説としては こっちの方がわかりやすいかな。以下のような手順で攻撃する。

  1. 細工した sendmail.cf を添付して Squirrelmail 稼動ホストにメールを送る
  2. 添付ファイルがひっぺがされて単体のファイルとして置かれるので、そのファイル名を取得
  3. ユーザ設定で "-C <添付したsendmail.cf>" を含むように細工した From アドレスを設定
  4. このユーザでメールを送信
  5. 添付した sendmail.cf の中に仕込んでおいたコマンドが発動

_ で、PoC では最初のステップで sendmail.cf を添付してメールしてるので sendmail でしか動かないけど、添付するのは別に sendmail.cf じゃなくてもいいよね。コマンドラインで設定ファイルを指定できるのは sendmail だけでなく exim もそうなので、かわりに exim.conf を添付してやれば exim で同じようにコード実行できるよね。確認してないけど、たぶん。postfix と qmail はコマンドラインで設定ファイルを指定できないので、同じことはできないはず。

_ さらに、 Host ヘッダからコード注入する件ってのは exim の文字列展開機能を使うらしい。sendmail -be で発動できるってことは、これ、squirrelmail の脆弱性でも利用可能だよね。つまり、From アドレスに "-C <添付したsendmail.cf>" を設定するかわりに、"-be <実行コマンド>" とすればよい。添付ファイルつきのメールを送るというステップを省略できてたいへんお手軽。ほんとに動くか確認はしてないけどね。

_ php のメール送信からのコード実行を可能にしている mail() や escapeshellarg() もお粗末だけど、exim の文字列展開もヒドい仕様だよね。struts の OGNL もそうなんだけど、こういった eval に類似した仕組みってのは、そういうものを実装しようという発想そのものが潜在的な脆弱性だと思う。外部から任意のコードを eval できる方法が見つからないうちはとりあえず問題ないけど、万が一その方法が発見されると致命的な結果をもたらす。便利かもしれないけど、不具合があった場合のことを考えたらそうそう気軽に採用できるものではないはず。


<< = >>
やまや