SE Can't Code

A Tokyo based Software Engineer. Not System Engineer :(

あるshellshockの日の職場では。

今年はどういった年だったかと聞かれれば、脆弱性が発見される年だったなぁという印象がある。特にshellshockが発見された日の朝は、はてブからいろいろなところが騒いでいたので、内容を見ても「おお、これはヤバいな、、これは会社もてんやわんやだろうな」と思いながら出社した記憶がある。しかしいざ職場についてみると、そこに広がっていた光景は、何も変わらない、まさに平穏そのものだった。
まぁWeb屋じゃないし、セキュリティ的にも焦る必要もないのかな、と思ってはいたけれど、職場ではbashの「バ」の字すら出ることはなかった。世界はあんなに騒いでいるのに、我関せずという職場が異様に思えた。耐え切れず、自プロジェクトの維持管理専門の協力会社のおっちゃんに「bash脆弱性ってどうなってるんですか?うちは関係無さそうですけど、念のため調べません?」と聞くと、「え、なにそれ??」という反応が返ってきた。

自「内容見た限り環境変数周りの脆弱性で、インパクト大きいらしいですよ」
お「まじか!(ググりだす)...お、なかなか騒ぎになってるね」
自「じゃあちょっと商用ルーム行って調べますか。」
お「でもすぐ進捗会議じゃない?」
自「」

結局、その後の進捗会議でも「バ」の字すら出なかった。ちなみに隣プロジェクトでも同様で、おそらくなのだけれど誰もその時には知らなかったのだと思う(あとあと聞いた話によるとさすがに基盤チームでは対応していたらしい)。あんなに騒がれていたのにも関わらず。また、会社としてもshellshockについての告知はたしか週明けになってようやく出てきたと記憶している。騒ぎが出たその日のうちに各ディストリビューションがパッチを公開し、多くの会社が対応していたというのに、なんとも言えない気持ちになった。他社のエンジニアの友人らとその後話を聞くと、その日はshellshockをひたすら対応していたと言ってた。

今年はOpenSSLでも脆弱性見つかったし、果ては一太郎でも見つかったようだ。
さて、外部からの攻撃と言えば、Webサービスやアプリを作る時に脆弱性を意識するものである。そこで代表的な二つのWebの脆弱性への攻撃方法と面白いサービスの紹介をしようと思う。別に僕はクラッカーではないので、あしからず(そんな能力はない)。

クロスサイトスクリプティング(cross site scripting、XSS


■概要
ユーザに目的のwebサイトとは別の罠サイトを踏ませて悪意のあるプログラムを実行させる攻撃。
罠サイトのCookieデータを攻撃者に改竄され、本人になりすましてアクセスされるといったことがある。

■対策
・ HTMLの実体参照を用い、& を & に、< を < に、> を > に、" を " に、それぞれ置換する。 PHPではhtmlspecialchars関数を用いれば、一括で対策できる。
・ タグの属性値は必ず "~" (ダブルクオート)で括る。また属性値中のエスケープを忘れない。かつ、「style href src onclick onload などの危険な属性に対してユーザー入力を用いない」
cookieを使う際の、HttpOnlyを指定(JavaScriptからクッキーを読み込まれないようにする)

SQLインジェクション(SQLInjection)


■概要
アプリケーションの意図しないSQLを実行させ、不正にデータベースを操作する攻撃。

一番有名なシングルクォート「'」を使った攻撃方法を紹介する。 たとえば以下のようなSQLでユーザIDとpasswordを入力し、該当するユーザの存在が確認出来ればwebページにログインできるというケースがあるとする。

SELECT * FROM ユーザマスタ WHERE ユーザID = '{$userId}' AND パスワード = '{$passwd}'

ここでパラメーターを以下のようにする。 $userId : 「sotoshigoto」 $passwd : 「'OR'A'='A」

すると下記のSQLが生成される。

SELECT * FROM ユーザマスタ WHERE ユーザID = 'sotoshigoto' AND パスワード = '' OR 'A' = 'A'

シングルクォートをpassIdのパラメーターに含ませることで、パスワードのWHERE句条件式を終了させることができ、その後にOR句が追加される形となる。OR句後の'A'='A'により、WHERE句全体が常に真となるようになり、パスワードの入力なく、ユーザID「sotoshigoto」としてログインが可能となる。

■対策
プレースホルダを使用する。

面白いWebサイト


上記の知識だけだと全然足りないのだけれど、自身がクラッカーとなったつもりで脆弱性を発見するゲームがある。「GameOfHacks」という、難易度別にコードが出題され、脆弱性を答えていくゲームになる。残念なことに答えても回答が返ってこないので、ある程度の知識がないと「え、わからない。。」で終わってしまうので、Webの脆弱性について勉強した後に遊び半分で挑戦してみるといいかもしれない。自分は会社の通勤時間にたまにやってたりする。

f:id:fixxman:20141207233506j:plain

Game of Hacks | Checkmarx

ReCAPTCHAでもそうだけれど、セキュリティと攻撃者の技術の進歩は日進月歩だ。またソフトウェアの隠れた脆弱性というものも次第に明らかになっていくため、SE(システムエンジニア)を名乗るのならば、日々アンテナ立てて、置いていかれないようにしなければならない。と、今日もGameOfHacksを答えられずに思うのであった。

Remove all ads