BLOG

ブログ

  • Top
  • Blog
  • 【エンジニア セキュリティ勉強会レポート】ソースコードのハッキングについて

【エンジニア セキュリティ勉強会レポート】ソースコードのハッキングについて

ブログサムネイル
Crunchtimer株式会社

著者:クランチタイマー株式会社

Twitter Icon

クランチタイマーはアプリ・Webサービスなどの開発を手掛けるWebデベロッパーです。ブログ記事ではロジカルで最適な手法を伝え、課題解決の手助けとなる情報を惜しみなく提供していきます。



今回は2023年3月17日にクランチタイマーで実施した、セキュリティ勉強会についてレポートします。

ソースコードのハッキングをテーマに、エンジニアを中心に対策方法などの知見を共有する会となりました。

ハッキングとは

元々の意味としては、コンピュータに関して豊富な知識をもつ者が、プログラムやシステムの解析・改変・検証などを行うことを指します。

しかし最近では、「コンピュータシステムやネットワークの脆弱性を狙って、悪意のある乗っ取りや破壊行為などの攻撃を行うこと」を指す言葉として使われています。

ハッキングの被害例

  • ・個人情報を盗む
  • ・盗んだ個人情報を販売する
  • ・被害者になりすまして買い物をする
  • ・被害者の名前でキャッシングを利用する
  • ・重要なファイルを公開・削除・破壊する
  • ・個人情報を公開、もしくは公開すると脅す
  • ・Webサイトを改ざんする
  • ・サーバーを停止する など

ハッキングの手法

SQLインジェクション

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)

クロスサイトスクリプティング(XSS)とは、Webサイトの脆弱性を利用し、記述言語であるHTMLに悪質なスクリプトを埋め込む攻撃です。

Webページ上にあるスクリプトを不正に操作することで、攻撃者が用意したスクリプトを実行させてしまいます。

(例)

  • ・攻撃者が、Webアプリケーションに不正なスクリプトを埋め込む (入力フォームにjavascriptを入力して実行するなど)
  • ・ユーザーが、Webアプリケーションにアクセスする
  • ・Webアプリケーションが、不正なスクリプトを実行する
  • ・攻撃者が、ユーザーの情報を収集するなどの攻撃を行う

具体的には、攻撃者がクッキーに残っているユーザー情報の取得や、攻撃者が用意したサイトへのリダイレクト処理、ユーザーが入力した情報を攻撃者のサイトに送信する、といったスクリプトを入力フォームなどに埋め込むような手法です。

フィッシング

不特定多数のユーザーに対し、メールやSMS、SNSなどで送信者や件名、内容を詐称したメッセージを送り付け、偽装したフィッシングサイトへ誘導する手法を指します。

(例)

  • ・偽のサイトやメールからパスワードを抜き取られる
  • ・ワードプレスの偽サイトからパスワードを抜き取られる

バックドア

バックドアとは、悪意ある第三者がシステム内部に侵入成功した後いつでも侵入できるように、情報システム内部から攻撃者の用意したサーバーに対して外部通信をするために設置したプログラムを指します。

(例)

  • ・標的型攻撃
  • 攻撃者が特定の個人、組織、企業などを狙ってバックドア攻撃を行うことがあります。
    例えば、電子メールの添付ファイルに偽装した悪意のあるファイルを送りつけ、ユーザーが開くとバックドアがシステムに作られてしまうことがあります。

  • ・パスワードの流出
  • 攻撃者がユーザーのパスワードを盗み出すことで、システムにアクセスすることができます。
    一度アクセスが可能になると、バックドアを作成することができます。

  • ・ソフトウェアの脆弱性の利用
  • セキュリティの脆弱性があるソフトウェアを悪用して、攻撃者はバックドアを作成することができます。
    例えば、WebサイトにSQLインジェクション攻撃を行うことで、攻撃者はデータベースにアクセスし、バックドアを作成することができます。

  • ・不正なプログラムのインストール
  • ユーザーがダウンロードした不正なプログラムには、バックドアが含まれていることがあります。
    一度インストールされると、バックドアは機能し攻撃者がシステムにアクセスすることができます。

ハッキングへの対策方法

SQLインジェクションへの対策

  • プレースホルダを使用する
  • 変数に代入のようなもの 以下では ? の部分に value (入力されたもの) がはいります。

    query = "SELECT * FROM users WHERE username = ? AND password = ?"
    values = ('john', 'password123')
    cursor.execute(query, values)
    results = cursor.fetchall()
    

    (? に先ほどのクエリが入ってもクエリが成り立たなくなります)

  • 入力値の検証を行う
  • 文字列や数値などのバリデーションをします。

  • SQL文を直接組み立てない
  • 具体的には、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 は自動的にエスケープ処理が走ります。

    また、これらのバリデーションやエスケープ処理については、 バックエンドだけでなくフロントエンドでも対策が必要です。

クロスサイトスクリプティング(XSS)への対策

  • ・入力値の検証を行う
  • ・エスケープ処理を行う
  • ・Content Security Policy (CSP) を設定する

入力値の検証やエスケープ処理はSQLインジェクションでも説明したものです。

Content Security Policy (CSP) は、HTTPヘッダの設定、またはHTMLタグによる設定ができ、XSS攻撃を防止することができます。

フィッシング対策

  • ・メールの送信元や、サイトのURLを確認
  • ・自身のアカウントに2段階認証を設定
  • ・同じパスワードを使用しない
  • 一度パスワードを抜き取られた場合、別サービス(GitHubなど)の情報も抜き取られるかもしれないためです。

  • ・フィッシングにかかってしまったら即パスワードの変更をする

ラストパスなどパスワードを管理するアプリを使うのも手段の一つです。

バックドア対策

  • ・システムの脆弱性の把握や最新のセキュリティパッチの適用
  • ・セキュリティ意識の向上
  • ・ネットワーク監視システムの導入
  • ・ハードウェアやソフトウェアのセキュリティ対策の実施
  • ・監査やレビュー

セキュリティについてその他の注意事項

envファイルの取り扱いについての注意事項

envファイルとは、アプリに使用する機密情報などを取り扱うファイルです。

  • .envファイルのパーミッションを設定
  • .envファイルにwebアプリケーションからアクセスできないようにする
  • (.envファイルを.gitignoreに入れる gitにあげない)
  • チームで開発する際はenvファイルの環境変数だけ共有し、値は、例えば閲覧制限をかけたgoogleDriveで共有したり、ラストパスでチームで共有するなどの注意が必要です。

  • .envファイルのパーミッションを設定
  • 所有者 グループ その他ユーザー
    rw- — —
    rw- r– — など …
    所有者のみがenvファイルの読み取りと書き込みをできるように設定する必要があります。

  • .envファイルにwebアプリケーションからアクセスできないようにする
  • apacheファイル 例

    Order Allow,Deny
    Deny from all

    (envファイルにアクセスできない代わりに、アプリケーションからは.envで定義された環境変数を読み込む)

    DB_USERNAME = aaa
    DB_PASSWORD = iii

    フレームワークのアップデート

    古いバージョンのソフトウェアやフレームワークを使用している場合は、セキュリティの脆弱性が高くなっている可能性があるため、新しいフレームワークを使用する必要があります。

    例えば、laravelで回避できている攻撃手段の他に、新しく攻撃手段が作成された場合、laravelでは回避できなくなるなどのケースがあります。

    フロントエンドと、バックエンド両方でバリデーションをかける

    理由としては、ブラウザの検証ツールでフロントのバリデーションは簡単に書き換えられるためです。

    フロントエンドでのバリデーションは、ユーザーが入力する際に直接エラーを表示することができ、UXを向上させることができますが、ブラウザのツールなどを使って回避することができるため、バックエンドでのバリデーションが必要です。

    バックエンドでのバリデーションは、アプリケーションのセキュリティを強化し、不正なデータがデータベースに保存されないようにするとともに、外部のアプリケーションにも適用され、アプリケーション全体のセキュリティを向上させることができます。

    したがって、フロントエンドとバックエンドの両方でバリデーションを行うことが重要です。

    まとめ

    クランチタイマーで実施した、セキュリティ勉強会レポートは以上です。

    エンジニアの皆さんにとっても、セキュリティ対策の一助となれば幸いです。

この記事をシェア  

link-icon

筆者

メディア編集部

クランチタイマーのメディア編集部です。 話題になった最新のWebサービスやアプリなど、ITに関するトレンド情報をお届けします。

最新情報を確認する

CONTACT

お気軽にお問い合わせください。

TEL082-299-2286

NEWSLETTER

代表の佐々⽊が⽉に1回お届けするメールマガジン。
国内外スタートアップの最新情報や最新技術のサマリー、クランチタイマーの開発事例紹介など、ITに関する役⽴つ情報を中⼼にお送りします!