「なぜか泥棒が入ってくる…?」コードに潜む“鍵のかけ忘れ”を見つける魔法のツール、SAST入門
こんにちは。セキュリティの世界で「穴」を塞ぐ仕事を長年していると、ふと気づくことがあります。セキュリティ事故の多くは、悪意ある天才ハッカーの仕業というより、「まさか、ここが空いているとは思わなかった」という開発者のうっかりから始まることが多いんです。
今日は、皆さんの書いたコードに潜む「インジェクション」という脆弱性を、開発の現場でどうやって早期に見つけるか、一緒に学んでいきましょう。
1. 「インジェクション」って何?:家に例えてみよう
インジェクション(注入)攻撃を一言で言えば、「プログラムの意図しない命令を、外からこっそり混ぜ込むこと」です。
これを身近な例に例えてみましょう。皆さんの家には「インターホン」がありますよね。本来なら「宅配便です」と来るところを、泥棒が「警察です、鍵を開けてください」と嘘の指示を書き込んで、ドアを開けさせるようなものです。
プログラムの世界では、データベースへの命令(SQL)や、OSへの命令(コマンド)がこの「ドア」にあたります。入力フォームに「名前」を入力する場所なのに、「名前を教えて。あ、ついでにデータベースの情報を全部教えて」という不正な指示を混ぜ込まれると、プログラムはそれを真に受けて実行してしまいます。これがインジェクション攻撃の恐ろしさです。
2. 人間の目だけじゃ限界がある!SASTの出番です
「じゃあ、コードを全部読んでチェックすればいいんでないの?」と思うかもしれませんが、数万行あるコードを毎日手作業でチェックするのは、プロでも至難の業です。
そこで登場するのがSAST(Static Application Security Testing:静的解析ツール)です。
SASTは、いわば「コード専門の防犯診断員」です。コードを実行する前に、「この書き方は、玄関の鍵がスカスカだよ!」「この関数は、泥棒に合鍵を渡しているようなものだよ!」と、自動で指摘してくれます。
3. CI/CDパイプラインに組み込む「自動防犯カメラ」
SASTは、ただ使うだけでなく「CI/CDパイプライン」に組み込むのが鉄則です。コードを保存(コミット)するたびに、裏で自動的に診断が走るようにします。
例えば、GitHub Actionsを使っている場合、以下のような設定をワークフローに追加するだけで、診断を自動化できます。
.github/workflows/security-check.yml
name: Security Scan
on: [push] # コードが更新されるたびに発動!
jobs:
sast_scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run SAST Scanner
# ここでは例として有名なオープンソースのツールを動かします
run: |
# 脆弱性があるコードを見つけたら警告を出して止める設定
semgrep –config auto .
# これにより、危ないコードが本番環境に行くのを未然に防げます!
4. 現場でよく見る「危ない書き方」と「安全な書き方」
実際に、どんなコードが危ないのか、SQLインジェクションを例に見てみましょう。
❌ やってはいけない書き方(泥棒に合鍵を渡している状態)
ユーザーの入力をそのまま文字列として結合している
user_input = get_user_name()
攻撃者が “‘; DROP TABLE users; –” と入力したら…大変なことになります!
sql = “SELECT FROM users WHERE name = ‘” + user_input + “‘”
✅ 安全な書き方(ドアを二重ロックする)
「プレースホルダ(バインド変数)」という仕組みを使います。これは、入力値を「命令」ではなく「ただの文字データ」として扱うための専用の鍵です。
ユーザーの入力を直接混ぜない!
user_input = get_user_name()
「?」を使って、後から安全な値として渡す
sql = “SELECT FROM users WHERE name = ?”
cursor.execute(sql, (user_input,)) # これなら攻撃されても「データ」としてしか扱われません!
最後に:セキュリティは「完璧」を目指さなくていい
新人の皆さん、セキュリティと聞くと「完璧にしなきゃ」と身構えてしまうかもしれません。でも、一番大切なのは「今日書いたコードの、昨日より一つ多い脆弱性を自動で見つけて直すこと」です。
SASTは、皆さんがコーディングに集中している横で、黙々と防犯チェックをしてくれる頼もしい相棒です。まずはツールを一つ導入して、「あ、ここ危ないですよ」と教えてもらう体験から始めてみてください。
一歩ずつ、安全な開発のスキルを積み上げていきましょう!応援していますよ。
コメント