Upgrade to Pro — share decks privately, control downloads, hide ads and more …

セキュリティ / 2023 ニフティ新人研修

セキュリティ / 2023 ニフティ新人研修

2023年度ニフティエンジニア新人研修の講義資料です。

ニフティ株式会社

December 14, 2023
Tweet

More Decks by ニフティ株式会社

Other Decks in Technology

Transcript

  1. Copyright © NIFTY Corporation All Rights Reserved. ⚠ 講義を受けるにあたって ⚠

    2 講義資料は基本的に世の中⼀般での話を記載しています 本講義はWebサービスの開発を⾏うにあたり必要となる セキュリティの基礎知識について理解していただくことが⽬的となります。 講義内容は、不正な⽬的で実⾏すると不正アクセス禁⽌法をはじめとする 法律抵触する可能性があるものも含まれます。 ⽬的は情報提供であり犯罪を助⻑するものではありませんので予めご理解ください。
  2. Copyright © NIFTY Corporation All Rights Reserved. 今⽇の⽬標 3 •

    最近のセキュリティインシデントを知り、 セキュリティの重要性を認識する • SQLインジェクションやCSRFといった Webアプリケーションに対する 基本的な攻撃⼿法とその対策法について理解する
  3. Copyright © NIFTY Corporation All Rights Reserved. 4 ⽬次 01

    セキュリティ⼊⾨ - セキュリティ3要素と脆弱性 - 情報セキュリティの10⼤脅威 - 最近起こったセキュリティ事件 02 Webアプリでの攻撃⼿法 - HTMLのソースからの機密情報漏洩 - SQLインジェクション - XSS(クロスサイトスクリプティング) - CSRF(クロスサイトリクエストフォージェリ) 03 Webアプリの開発にあたって - 脆弱性情報について - GitHub利⽤上の注意
  4. Copyright © NIFTY Corporation All Rights Reserved. 5 ⽬次 01

    セキュリティ⼊⾨ - セキュリティ3要素と脆弱性 - 情報セキュリティの10⼤脅威 - 最近起こったセキュリティ事件 02 Webアプリでの攻撃⼿法 - HTMLのソースからの機密情報漏洩 - SQLインジェクション - XSS(クロスサイトスクリプティング) - CSRF(クロスサイトリクエストフォージェリ) 03 Webアプリの開発にあたって - 脆弱性情報について - GitHub利⽤上の注意
  5. Copyright © NIFTY Corporation All Rights Reserved. セキュリティの3要素 7 完全性

    Integrity 機密性 Confidentialit y 可⽤性 Availabilit y 情報セキュリティは、機密性、完全性、可⽤性を維持すること 以下を加えて7要素とも 真正性(authenticity) 責任追跡性(accountability) 否認防⽌(non-repudiation) 信頼性(reliability)
  6. Copyright © NIFTY Corporation All Rights Reserved. 機密性 8 Confidentiality

    許可された利⽤者のみが許可された範囲で利⽤できる 確保する仕組み例︓アクセス制御・施錠
  7. Copyright © NIFTY Corporation All Rights Reserved. 完全性 9 Integrity

    情報が完全で正確であること (破壊・改ざん・消去がされないこと) 確保する仕組み例︓ディジタル署名・防⽕防災
  8. Copyright © NIFTY Corporation All Rights Reserved. 可⽤性 10 Availability

    使いたいと思ったときにいつでも使える 確保する仕組み例︓冗⻑化・バックアップ
  9. Copyright © NIFTY Corporation All Rights Reserved. 情報セキュリティの敵はサイバー攻撃だけではない 11 災害

    操作ミス 故障 これらも機密性・完全性・可⽤性を低下させる︕
  10. Copyright © NIFTY Corporation All Rights Reserved. リスクが現れる条件 12 情報資産

    脅威 脆弱性 顕在化 リスク 守りたいもの 情報資産を 脅かすもの 脅威に対する 弱点
  11. Copyright © NIFTY Corporation All Rights Reserved. 脅威 13 物理的

    技術的 ⼈的 ⽕災・地震・停電 敷地への侵⼊・機器の故障 例 不正アクセス・なりすまし・DoS バグ・XSS・マルウェア・標的型攻撃 例 紛失・誤操作 内部犯・サボタージュ 例
  12. Copyright © NIFTY Corporation All Rights Reserved. 脆弱性 14 物理的

    技術的 ⼈的 オフィスが施錠されていない 外壁が⽊製で燃えやすい 例 PCがロックされていない セキュリティホール* (*…ソフトウェアの不具合や設計ミスによる⽋陥) 例 うっかりミス 内部犯の発⽣ 例 今⽇は主にWebにおける セキュリティホールについて お話します
  13. Copyright © NIFTY Corporation All Rights Reserved. セキュリティホールを放置していると…︖ 15 攻撃者に悪⽤される危険がある

    例えば… - 不正アクセスによって、ホームページを改ざんされる - 他のコンピュータを攻撃するための踏み台に利⽤される - マルウェアの発信源になる
  14. Copyright © NIFTY Corporation All Rights Reserved. 情報セキュリティの10⼤脅威 16 https://www.ipa.go.jp/security/10threats/10threats2023.html

    2022年において社会的に影響が⼤きかったセキュリティ上の脅威について 「10⼤脅威選考会」の審議・投票結果に基づき決定
  15. Copyright © NIFTY Corporation All Rights Reserved. 17 ⽬次 01

    セキュリティ⼊⾨ - セキュリティ3要素と脆弱性 - 情報セキュリティの10⼤脅威 - 最近起こったセキュリティ事件 02 Webアプリでの攻撃⼿法 - HTMLのソースからの機密情報漏洩 - SQLインジェクション - XSS(クロスサイトスクリプティング) - CSRF(クロスサイトリクエストフォージェリ) 03 Webアプリの開発にあたって - 脆弱性情報について - GitHub利⽤上の注意
  16. Copyright © NIFTY Corporation All Rights Reserved. Webにおける著名な脆弱性 18 XSS

    クロスサイトスクリプティング CSRF クロスサイトリクエストフォージェリ SQLインジェクション HTMLソースからの 情報漏えい
  17. Copyright © NIFTY Corporation All Rights Reserved. HTMLのソースからの機密情報漏えい 19 ⼀⾒、なにもなさそうでも…︖

    ⾒えてないから問題ない…︖本当に…︖︖ ソースを表⽰すると実は︕
  18. Copyright © NIFTY Corporation All Rights Reserved. SQLインジェクション 20 DBを利⽤するWebアプリケーションにて不正なSQLを実⾏される

    データベース内の情報を⾃由に改ざん・窃取できる 攻撃者 ①悪意のあるSQLを ⼊⼒欄へ⼊⼒ ② ⼊⼒されたSQL⽂が 埋め込まれた クエリを発⾏ 脆弱性のある Webアプリ データベース
  19. Copyright © NIFTY Corporation All Rights Reserved. 21 例えば、ログイン時にID/PWを⼊⼒してログインする場合に このようなクエリが組み⽴てられる…

    ①ID/PWを ⼊⼒欄へ⼊⼒ ② ⼊⼒されたSQL⽂が 埋め込まれた クエリを発⾏ 脆弱性のある Webアプリ データベース ユーザー SELECT id FROM users WHERE id = '{id}' AND passwd = '{passwd}' SQLインジェクション
  20. Copyright © NIFTY Corporation All Rights Reserved. 22 通常時 ①ID/PWを

    ⼊⼒欄へ⼊⼒ ② ⼊⼒されたSQL⽂が 埋め込まれた クエリを発⾏ 脆弱性のある Webアプリ データベース ユーザー id = admin passwd = pizza SELECT id FROM users WHERE id = 'admin' AND passwd = 'pizza' SQLインジェクション
  21. Copyright © NIFTY Corporation All Rights Reserved. 23 脆弱性を利⽤されると… ①ID/PWを

    ⼊⼒欄へ⼊⼒ ② ⼊⼒されたSQL⽂が 埋め込まれた クエリを発⾏ 脆弱性のある Webアプリ データベース 攻撃者 SQLインジェクション id = admin passwd = ʼ OR ʻtʼ = ʻt SELECT id FROM users WHERE id = 'admin' AND passwd = '' OR 't' = 't'
  22. Copyright © NIFTY Corporation All Rights Reserved. SQLインジェクションの対策 25 1.プリペアドステートメントを利⽤する

    2. Webフレームワーク(ORM)を利⽤する 3. WAF(Web Application Firewall)を利⽤する $data = $db->prepare( 'SELECT id FROM users WHERE id = (:id) LIMIT 1;' ); $data->bindParam( ':id', $id, PDO::PARAM_INT ); $data->execute();
  23. Copyright © NIFTY Corporation All Rights Reserved. XSS(Cross Site Scripting/クロスサイトスクリプティング)

    26 XSSとは、どんな問題か︖ - ユーザのブラウザ上で攻撃者のスクリプトが実⾏される XSSとは、どんな影響があるか︖ - セッションIDの摂取 - 再認証を伴わない機能の不正使⽤ - コンテンツの改ざん など XSSとは、どんな機能で発⽣するか︖ - ユーザの⼊⼒値を出⼒するWebページ 罠サイトや罠Eメール 脆弱なサイト 混乱を避けるため、CSSとは略称されない︕
  24. Copyright © NIFTY Corporation All Rights Reserved. XSSざっくりイメージ 27 <!DOCTYPE

    html> <html> <head> <meta charset="utf-8"> <title>xss emtg</title> </head> <body> <script>alert('Hello World')</script> </body> </html> scriptタグで囲まれた所に、JavaScriptコードを埋め込める︕ <script> (悪意のあるスクリプト) </script> HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>xss emtg</title> </head> <body> <script>alert('Hello World')</script> </body> </html> scriptタグとかも⼊⼒できてしまったら... 対策もされていなかったら.... ⼊⼒値が挿⼊できるとする スクリプト実⾏ ⼊⼒ <script> (悪意のあるスクリプト) </script>
  25. Copyright © NIFTY Corporation All Rights Reserved. XSSの種類 28 反射型(Reflected)

    リクエストの⼊⼒値をレスポンスに出⼒する際に発⽣ 蓄積型(Stored) データストアに保存した⼊⼒値を出⼒する際に発⽣ DOM Based ⼊⼒値をJavaScript上で不適切に使⽤することで発⽣ 詳細は以下を参考 https://jvndb.jvn.jp/ja/cwe/CWE-79.html 検索サイト 掲⽰板サイト
  26. Copyright © NIFTY Corporation All Rights Reserved. XSSの対策(⼀部) 30 変換前

    ʻ “ < > & 変換後 &#39; $quot; &lt; $gt; &amp; Webページに出⼒する全ての要素に対して、エスケープ処理を施す <script></script> &lt;script&gt;&lt;/script&gt; エスケープ処理 スクリプトとして解釈されなくなる︕ 詳細は以下を参考 https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html 超基本
  27. Copyright © NIFTY Corporation All Rights Reserved. 参考︓ Webアプリケーションフレームワーク HTML⾃動エスケープ

    31 • Flask → デフォルトで⾃動エスケープ(拡張⼦が限定 .html, .htm, .xml など) https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/templating.html • Django → デフォルトで⾃動エスケープ https://docs.djangoproject.com/ja/4.2/ref/templates/language/#automatic-html-escaping • FastAPI(≒ starlette) → デフォルトで⾃動エスケープ ドキュメントに書いてなさそう︖ ⾒つけたら教えて〜 https://github.com/encode/starlette/blob/24c1fac62a80bb153c6548145334fc643991e35a/starlette/templating.py#L87 Pythonだけで、すみません... 😥 HTML⾃動エスケープするように 設定されているのがほとんど。 Webフレームワークを使うのは良い選択です︕ セキュリティが全て担保される訳ではありません。 各リファレンス等を⾒てください。
  28. Copyright © NIFTY Corporation All Rights Reserved. XSSの対策(⼀部) 32 URLの出⼒は

    [http://]や [https://] で始まるURLのみを許可 <script>...</script> 要素の内容を動的に⽣成しない 詳細は以下を参考 https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html <a href=“https://www.nifty.com/”></a> HTML(aタグ) 「javascript: (スクリプト)」とするとaタグを クリックした際にJavaScriptを実⾏させることができる︕ 上⼿く悪⽤されて任意のスクリプトを埋め込まれる可能性が⽣じるのを防ぐ
  29. Copyright © NIFTY Corporation All Rights Reserved. XSSの対策(⼀部) 33 詳細は以下を参考

    https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies CookieにHttpOnly、Secure属性を付ける など ⼊⼒値の内容チェック 数字のみの⼊⼒フォーム(例えば、電話番号、郵便番号 など) 012345678 数字以外が存在したら受け⼊れない︕ HttpOnly ・・・ JavaScriptからCookieの値にアクセスするのを防ぐ Secure ・・・ HTTPS通信でのみ送信される
  30. Copyright © NIFTY Corporation All Rights Reserved. コラム︓⼊⼒値について 34 「0」か「1」しか⼊⼒されない︖

    JavaScriptなどで⼊⼒値をチェックしている場合でも、JSの無効化/書き換えがされるかも︕ サーバに送信された値を、サーバ側でちゃんとチェックが必要 ラジオボタン形式の⼊⼒フォーム 「会員 = 1」「会員でない = 0」 いえ、開発ツールやプロキシツールでGETやPOSTの値は簡単に書き換えられます︕
  31. Copyright © NIFTY Corporation All Rights Reserved. CSRF(Cross Site Request

    Forgeries/クロスサイトリクエストフォージェリ) 35 CSRFとは、どんな問題か︖ - 他サイトからのリクエストが実⾏される CSRFとは、どんな影響があるか︖ (ログイン済みの場合) - 利⽤者のみが利⽤可能なサービスの悪⽤ - ユーザが意図していない操作が実⾏ CSRFとは、どんな機能で発⽣するか︖ - ⼊⼒データを使って処理するすべての機能 画像引⽤︓ 「IPA - 安全なウェブサイトの作り⽅ - 1.6 CSRF (クロスサイト・リクエスト・フォージェリ)」 https://www.ipa.go.jp/security/vuln/websecurity/csrf.html
  32. Copyright © NIFTY Corporation All Rights Reserved. CSRFざっくりイメージ 36 ログイン

    セッションID 以降、⼀定期間はセッションIDを送ることでログイン状態を保つ (※ サーバ側は、セッションIDでユーザを特定できる︕) パスワードを 変更しました︕ 勝⼿にリクエストを 送るように仕向ける パスワード変更リクエスト (with セッションID)
  33. Copyright © NIFTY Corporation All Rights Reserved. CSRFの対策(⼀部) 38 前のページで秘密情報を挿⼊し、実⾏ページでその値が正しいことを確認する

    前のページ + hiddenパラメー タ POST hiddenパラメータで送られ たトークンを検証する ⼊⼒データ + hiddenパラメータ ⼊⼒フォーム 検証が通れば実⾏︕ 処理 詳細は以下を参照 https://www.ipa.go.jp/security/vuln/websecurity/csrf.html hiddenパラメータには 独⾃に⽣成された予測困難な値を使う (Webフレームワークでは⼤体これ) ⼊⼒ 確認 実⾏ hiddenを 仕込む hiddenを ⼀緒に送る
  34. Copyright © NIFTY Corporation All Rights Reserved. CSRFの対策(⼀部) 39 reCAPTCHAを使う

    Refererが正しいリンク元か確認する Refererが空の場合は、処理を実⾏しないようでないと意味がない。 しかし、Refererを送信しないユーザに不都合が起こってしまう。 詳細は以下を参照 https://www.ipa.go.jp/security/vuln/websecurity/csrf.html https://aaaa https://bbbb https://aaaa Referer ・・・直前にいたURL ブラウザが勝⼿につけてくれる
  35. Copyright © NIFTY Corporation All Rights Reserved. 40 ⽬次 01

    セキュリティ⼊⾨ - セキュリティ3要素と脆弱性 - 情報セキュリティの10⼤脅威 - 最近起こったセキュリティ事件 02 Webアプリでの攻撃⼿法 - HTMLのソースからの機密情報漏洩 - SQLインジェクション - XSS(クロスサイトスクリプティング) - CSRF(クロスサイトリクエストフォージェリ) 03 Webアプリの開発にあたって - 脆弱性情報について - GitHub利⽤上の注意
  36. Copyright © NIFTY Corporation All Rights Reserved. 脆弱性情報 41 脆弱性情報を⾒る上で、知っておきたい3つの⽤語

    ・CVSS(Common Vulnerability Scoring System) ・共通脆弱性評価システム ・脆弱性の深刻度を評価する指標 ・CWE(Common Weakness Enumeration) ・共通脆弱性タイプ⼀覧 ・ソフトウェアにおけるセキュリティ上の脆弱性の種類を識別するための共通の基準 ・CVE(Common Vulnerabilities and Exposures) ・共通脆弱性識別⼦ ・1999年に運⽤を開始したサイバーセキュリティの脆弱性に関する共通名の辞書
  37. Copyright © NIFTY Corporation All Rights Reserved. CVSS 42 「脆弱性の深刻度」情報

    ベンダ⾮依存の1つの基準で定量的な⽐較が可能 3つの基準で脆弱性を評価する。(各10点満点) 7.3 6.7 4.4 基本評価値 現状評価値 環境評価値 どれぐらい ヤバイ 脆弱性か 攻撃くる可 能性ある︖ どこで このソフト 使ってる︖
  38. Copyright © NIFTY Corporation All Rights Reserved. CVSS 43 「脆弱性の深刻度」情報

    ベンダ⾮依存の1つの基準で定量的な⽐較が可能 3つの基準で脆弱性を評価する。(各10点満点) 7.3 基本評価値 どれぐらい ヤバイ 脆弱性か JVNで公開される数値はコレ︕
  39. Copyright © NIFTY Corporation All Rights Reserved. GitHubでのソース流出と対策 44 GitHubでのソース流出等のセキュリティ事件は近年よく起こります。

    ただ、そのほとんどが⼈為的なミスによるものです︕ GitHubソースコードの流出事件 https://www.itmedia.co.jp/news/articles/2101/29/news107. html GitHubでの個⼈情報漏洩 https://www.itmedia.co.jp/business/articles/2210/07/news1 74.html ・個⼈アクセストークンの保管に注意する ・セキュアな情報の公開に気をつける いくつかの社内ルールはNotionでまとめられています︕
  40. Copyright © NIFTY Corporation All Rights Reserved. まとめ 45 開発する上で共通して守ってほしいセキュリティについてお話ししました。

    ➢ 脆弱性が残っていると重⼤な情報漏えいにつながることがあります。 既知の脆弱性を理解し、対策をしましょう。 ➢ Webアプリケーションの代表的な攻撃⼿法を説明しました。 世の中のWebフレームワークでは対策が取られている部分が多いですが 完璧ではないです。知識として知っておき必要な対策を取れるようにしましょう。 ➢ 脆弱性情報の紹介、GitHub利⽤上の注意もしました。 今後、様々なツールを使うことになると思います。 脆弱性情報を注視して、利⽤ルールを守って使いましょう。
  41. Copyright © NIFTY Corporation All Rights Reserved. (参考)もっとWebセキュリティを勉強したい 46 書籍

    • “体系的に学ぶ 安全なWebアプリケーションの作り⽅ 第2版” - 徳丸 浩 著 Web資料 • IPA - 安全なウェブサイトの作り⽅ https://www.ipa.go.jp/security/vuln/websecurity.html ワークショップ • AWS Security Workshops https://awssecworkshops.com/