今回は2023年3月17日にクランチタイマーで実施した、セキュリティ勉強会についてレポートします。
ソースコードのハッキングをテーマに、エンジニアを中心に対策方法などの知見を共有する会となりました。
元々の意味としては、コンピュータに関して豊富な知識をもつ者が、プログラムやシステムの解析・改変・検証などを行うことを指します。
しかし最近では、「コンピュータシステムやネットワークの脆弱性を狙って、悪意のある乗っ取りや破壊行為などの攻撃を行うこと」を指す言葉として使われています。
SQLインジェクションとは、第三者がSQLコマンドを悪用してデータベースを不正に操作し、情報を搾取や改ざん、削除する攻撃手法を指します。
Webフォームなどの入力フォームにSQL文を入力・送信することで行われることが多いです。
以下、ログインフォームを例とします。
(例)
通常
SELECT * FROM users WHERE username = '$username' AND password = '$password';
SQLインジェクション
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';
OR ‘1’=’1′ など、全てが真になるSQL文を送信して、ユーザー情報を抜き取るもの
クロスサイトスクリプティング(XSS)とは、Webサイトの脆弱性を利用し、記述言語であるHTMLに悪質なスクリプトを埋め込む攻撃です。
Webページ上にあるスクリプトを不正に操作することで、攻撃者が用意したスクリプトを実行させてしまいます。
(例)
具体的には、攻撃者がクッキーに残っているユーザー情報の取得や、攻撃者が用意したサイトへのリダイレクト処理、ユーザーが入力した情報を攻撃者のサイトに送信する、といったスクリプトを入力フォームなどに埋め込むような手法です。
不特定多数のユーザーに対し、メールやSMS、SNSなどで送信者や件名、内容を詐称したメッセージを送り付け、偽装したフィッシングサイトへ誘導する手法を指します。
(例)
バックドアとは、悪意ある第三者がシステム内部に侵入成功した後いつでも侵入できるように、情報システム内部から攻撃者の用意したサーバーに対して外部通信をするために設置したプログラムを指します。
(例)
攻撃者が特定の個人、組織、企業などを狙ってバックドア攻撃を行うことがあります。
例えば、電子メールの添付ファイルに偽装した悪意のあるファイルを送りつけ、ユーザーが開くとバックドアがシステムに作られてしまうことがあります。
攻撃者がユーザーのパスワードを盗み出すことで、システムにアクセスすることができます。
一度アクセスが可能になると、バックドアを作成することができます。
セキュリティの脆弱性があるソフトウェアを悪用して、攻撃者はバックドアを作成することができます。
例えば、WebサイトにSQLインジェクション攻撃を行うことで、攻撃者はデータベースにアクセスし、バックドアを作成することができます。
ユーザーがダウンロードした不正なプログラムには、バックドアが含まれていることがあります。
一度インストールされると、バックドアは機能し攻撃者がシステムにアクセスすることができます。
変数に代入のようなもの 以下では ? の部分に value (入力されたもの) がはいります。
query = "SELECT * FROM users WHERE username = ? AND password = ?"
values = ('john', 'password123')
cursor.execute(query, values)
results = cursor.fetchall()
(? に先ほどのクエリが入ってもクエリが成り立たなくなります)
文字列や数値などのバリデーションをします。
具体的には、ORM(Object Relational Mapper)などを使用します。
RDB(Relational Database: 関係 データベース)に対する操作がカプセル化されたORM用のライブラリを使用し、これがSQLの生成などを背後で行ってくれます。
( LaravelやRuby on Rails の直接SQLを書かないモデルの処理)
シングルクォートやダブルクォートなどが含まれる場合に、それらの文字をエスケープする必要があります。
Laravelなどのフレームワークを使用していれば、自然と対策ができていることになります。
$user = new User;
$user->name = $request->input('name');
$user->save();
プロパティに値を設定することで、自動的にプレースホルダが使用されます。
SQL文を直接使用していない
$user->name は自動的にエスケープ処理が走ります。
また、これらのバリデーションやエスケープ処理については、 バックエンドだけでなくフロントエンドでも対策が必要です。
入力値の検証やエスケープ処理はSQLインジェクションでも説明したものです。
Content Security Policy (CSP) は、HTTPヘッダの設定、またはHTMLタグによる設定ができ、XSS攻撃を防止することができます。
一度パスワードを抜き取られた場合、別サービス(GitHubなど)の情報も抜き取られるかもしれないためです。
ラストパスなどパスワードを管理するアプリを使うのも手段の一つです。
envファイルとは、アプリに使用する機密情報などを取り扱うファイルです。
チームで開発する際はenvファイルの環境変数だけ共有し、値は、例えば閲覧制限をかけたgoogleDriveで共有したり、ラストパスでチームで共有するなどの注意が必要です。
所有者 グループ その他ユーザー
rw- — —
rw- r– — など …
所有者のみがenvファイルの読み取りと書き込みをできるように設定する必要があります。
apacheファイル 例
Order Allow,Deny
Deny from all
(envファイルにアクセスできない代わりに、アプリケーションからは.envで定義された環境変数を読み込む)
DB_USERNAME = aaa
DB_PASSWORD = iii
古いバージョンのソフトウェアやフレームワークを使用している場合は、セキュリティの脆弱性が高くなっている可能性があるため、新しいフレームワークを使用する必要があります。
例えば、laravelで回避できている攻撃手段の他に、新しく攻撃手段が作成された場合、laravelでは回避できなくなるなどのケースがあります。
理由としては、ブラウザの検証ツールでフロントのバリデーションは簡単に書き換えられるためです。
フロントエンドでのバリデーションは、ユーザーが入力する際に直接エラーを表示することができ、UXを向上させることができますが、ブラウザのツールなどを使って回避することができるため、バックエンドでのバリデーションが必要です。
バックエンドでのバリデーションは、アプリケーションのセキュリティを強化し、不正なデータがデータベースに保存されないようにするとともに、外部のアプリケーションにも適用され、アプリケーション全体のセキュリティを向上させることができます。
したがって、フロントエンドとバックエンドの両方でバリデーションを行うことが重要です。
クランチタイマーで実施した、セキュリティ勉強会レポートは以上です。
エンジニアの皆さんにとっても、セキュリティ対策の一助となれば幸いです。
SHARE:
お気軽にお問い合わせください。
TEL082-299-2286
代表の佐々⽊が⽉に1回お届けするメールマガジン。
国内外スタートアップの最新情報や最新技術のサマリー、クランチタイマーの開発事例紹介など、ITに関する役⽴つ情報を中⼼にお送りします!