クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

セキュリティコードレビューの進め方

このレッスンのあとで: チェックリストを使って差分を読み、危ない行に重大度を付けて指摘できる。

60分のレッスンコマンド3件SQL インジェクションのラボ:弱い検索を攻撃し、クエリを直して確かめる

セキュリティコードレビューとは

セキュリティコードレビューとは、他の人が書いたコードを、安全の目で読んで、弱点を見つけることです。機能のテストが通るコードにも弱点は残るので、読んで見つける人が要ります。

履修登録サービスに、新しい変更が出されました。画面は動いています。でも、この変更を、そのまま取り込んでよいでしょうか。

このレッスンのゴール

メモ

チェックリストを使って差分を読み、危ない行に重大度を付けて指摘できる。

今日のキーワード

ことばいみれい
コードレビュー書いた人とは別の人が、コードを読んで確かめることです。
差分変更前と変更後の違いだけを並べたものです。+ 増えた行
チェックリスト見落とさないために、確かめる項目を並べた表です。
重大度見つけた問題が、どれだけ急ぎで危ないかの段階です。
指摘レビューで書く、問題と直し方の連絡です。

学生が入力するセルは、このプレビューでは空白です。

たった1つのルール

注意

見てよいのは、自分専用のラボのコピーだけです。このラボは、わざと弱く作った店で、インターネットにはつながっていません。許可のない他人のシステムに同じことをするのは、不正アクセス禁止法に触れる犯罪です。

チェックリストで読めば見落としが減る

コードを何となく読むと、動くかどうかばかり見てしまいます。そこで チェックリスト(checklist)を使います。確かめる項目を決めておき、1つずつ、コードに問いかけます。

これまでの5回に出てきた弱点が、そのまま項目になります。

セキュリティの確認項目

項目問うこと危ない印
入力使う前に検証しているか検証なしで計算や保存に使う
SQL値はパラメータで渡しているか文を + や f文字列でつなぐ
秘密鍵やパスワードがコードにないかpassword = "..." と直に書く
実行入力を命令として動かしていないかeval( や os.system( を使う
認証パスワードをソルト付きの遅いハッシュにしているか平文や md5( を使う
通信相手の証明を確かめているかverify=False と書く
エラー内部の作りを見せていないか例外の文字をそのまま返す

学生が入力するセルは、このプレビューでは空白です。

差分は増えた行と消えた行を読む

差分(diff)は、変更前と変更後の違いだけを並べたものです。- で始まる行は消えた行、+ で始まる行は増えた行です。

増えた行を中心に読みます。同時に、消えた行も見ます。消えた行が守りだったら、その変更は守りを外しています。

例: 守りを外す差分

差分の行印読んでわかること
rows = db.execute("... WHERE id = ?", (sid,))- 消えたパラメータで渡す、守りの行だった
rows = db.execute("... WHERE id = " + sid)+ 増えた値を連結していて、守りが外れた
print("debug", password)+ 増えた秘密を記録に出してしまう

学生が入力するセルは、このプレビューでは空白です。

指摘は行、問題、直し方を書く

指摘には、どの行か、何が危ないか、どう直すかの3つを書きます。人ではなく、コードの話をします。

見つけた問題には 重大度(severity)を付けます。攻撃されやすいか、被害が大きいかで決めて、急ぐものから直します。

重大度の付け方の例

重大度例直す時期
高値を連結したSQL文。認証なしで全員のデータが読める取り込む前に必ず
中エラーに内部の作りが出る今回か、次の変更で
低コメントに古い担当者の名前が残る手が空いたとき

学生が入力するセルは、このプレビューでは空白です。

店のプログラムで、検索を数える

レビューする人は、最初に検索で、危なそうな場所の数を数えます。ラボを起動して、店のプログラムに3つの検索をかけましょう。どれも数を見るだけです。

1つ目は、データベースを動かす行の数です。2つ目は、入力を命令として動かす eval( の数です。3つ目は、エラーを受ける所の数です。

データベースを動かす行

コマンド
docker exec app grep -c execute /tmp/app/app.py

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

入力を命令にする eval(

コマンド
docker exec app grep -c "eval(" /tmp/app/app.py

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

エラーを受ける所

コマンド
docker exec app grep -c except /tmp/app/app.py

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

3つの答えを読む

ラボを変えていなければ、6、0、1 と表示します。execute を含む行は6つあるので、6か所を読めばよいとわかります。eval( は0なので、この項目は心配が要りません。

数は、読む場所を絞る道具です。数が0でも、別の書き方が隠れていないかは、人が読んで確かめます。

よくある間違い

注意

「検索で何も出なかったから、安全だ」と考える人がいます。それは違います。検索は、決まった書き方しか見つけられません。文を変数に分けて作れば、検索をすり抜けます。検索で絞り、最後は人が読みます。

このラボとソースについて: SQL インジェクションのラボ:弱い検索を攻撃し、クエリを直して確かめる

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。