ログは「会社の防犯カメラ」!改ざんから守るためのセキュリティ入門
こんにちは!セキュリティの現場で日々、泥臭いインシデントと戦っているエンジニアです。
今日は、多くの開発者がつい見落としがちな「ログへのインジェクション攻撃」についてお話しします。「え、ログってただの記録でしょ?攻撃されるの?」と思うかもしれません。ですが、実はここ、攻撃者にとっては「警察官(管理者)の目を欺くための格好の穴場」なんです。
難しい専門用語を並べるのはやめて、身近な例えから一緒に紐解いていきましょう。
—
1. ログファイルは「会社の防犯カメラ」
あなたの会社の入り口に、24時間稼働している「防犯カメラ」があると思ってください。誰かが入ってきたら、そのカメラが自動的に「何時何分、誰々さんが入室しました」と記録をノートに書き留めます。
このノートこそが、システムの「ログファイル」です。
本来、このノートは「事実」だけを書き留めるべき神聖な場所です。しかし、もし悪い泥棒が、「ノートに自分で勝手に嘘の書き込みを追加できる」としたらどうでしょう?
これが「ログインジェクション」という攻撃の正体です。
—
2. 攻撃のメカニズム:なぜ「改行」が武器になるのか
攻撃者は、システムに入力するデータの中に、「改行コード(\r や \n)」をこっそり紛れ込ませます。
例えば、ログイン画面のユーザー名入力欄に、ただの名前ではなく、以下のような「細工された文字列」を入力したとしましょう。
佐藤太郎
[INFO] 2023-10-27 10:00:00 – システム管理者権限をユーザーID:999に付与しました。
システムがこの入力をそのままログに吐き出すと、ログファイルの中身はこうなってしまいます。
[INFO] 2023-10-27 09:59:00 – ユーザー「佐藤太郎」がログインしました。
[INFO] 2023-10-27 10:00:00 – システム管理者権限をユーザーID:999に付与しました。
管理者がこのログを見ると、「おや?10時に権限付与があったのか」と勘違いしてしまいますよね。実際にはそんな操作はしていないのに、ログが嘘をついているのです。これが、悪意ある改行コードによる「ログの偽造」です。
—
3. どうすれば防げるの?
対策は大きく分けて2つあります。一歩ずつ見ていきましょう。
対策①:入力値から「悪さをする文字」を排除する
ログに出力する前に、データに改行コードが含まれていないかチェックして、もしあれば削除、あるいは別の文字に置き換える(サニタイズ)のが鉄則です。
(例:Pythonでの実装イメージ)
import logging
def safe_log(user_input):
# 改行コードをスペースに置換して、ログの行をまたぐのを防ぐ
clean_input = user_input.replace(‘\n’, ‘ ‘).replace(‘\r’, ‘ ‘)
# 整形された安全なログのみを出力する
logging.info(f”ユーザーアクセス: {clean_input}”)
これなら攻撃者が改行を混ぜても、一行に収まるのでログが汚されません!
対策②:構造化ログ(JSON形式など)を採用する
これが現場での一番のおすすめです。ログを単純な文字列として保存するのではなく、機械が読み取りやすい「JSON形式」で保存します。
(JSON形式のログ例)
{“timestamp”: “2023-10-27 10:00:00”, “level”: “INFO”, “user”: “佐藤太郎”, “action”: “login”}
こうしておけば、入力値に改行コードが含まれていても、それはあくまで「user」という項目の中身として扱われます。ログの行が強制的に変わることはないので、「偽の行を勝手に作り出す」という攻撃が不可能になるんです。
—
4. セキュリティは「心の持ちよう」から
「ログなんて誰も見ていないだろう」と思っていると、そこが一番の付け目になります。攻撃者は、管理者がログを確認する際の「慣れ」や「思い込み」を突いてきます。
- ログは信頼できないものとして扱うこと
- 出力する直前に、必ず「そのデータは改行を含んでいないか?」を疑うこと
この二つを意識するだけで、あなたの守るシステムはグッと強固になります。
最初は難しく感じるかもしれませんが、まずは「ユーザーからの入力を、そのままログに垂れ流していないかな?」と確認することから始めてみてください。それが、プロへの第一歩です。
また分からないことがあれば、いつでも聞きに来てくださいね。一歩ずつ、一緒に強くなっていきましょう!
コメント