Slide 1

Slide 1 text

1 それ、本当に安全? 
 ファイルアップロードで見落としがち なセキュリティリスクと対策 ~ 2026年01月10日 BuriKaigi ~

Slide 2

Slide 2 text

池上 寛登(ikechi) ⾃⼰紹介 SUZURI‧minne事業部 Web Engineer X: penpeenpen GitHub: PenPeen

Slide 3

Slide 3 text

3 ● プロフィール画像 ● 動画‧⾳声ファイル ● CSV形式の⼀括登録機能 ファイルのアップロード機能について minne の画像アップロード機能

Slide 4

Slide 4 text

● 拡張⼦をチェックしているから⼤丈夫...! ● Content-Typeを⾒てるから⼤丈夫...! 4 セキュリティ対策、⼤丈夫? 本当にそれだけで大丈夫かな?

Slide 5

Slide 5 text

サイバー攻撃は年々増加傾向... 引⽤: https://blog.checkpoint.com/research/a-closer-look-at-q3-2024-75-surge-in-cyber-attacks-worldwide/ ● 2024年3Q 企業へのサイバー攻撃数は過去最⾼を記録(1,876件) ● 2023年の同時期と⽐較して75%増加

Slide 6

Slide 6 text

1. ファイルアップロードに潜む脅威 2. 「危険なファイルアップロード」のデモ 3. セキュアな実装のベストプラクティス アジェンダ

Slide 7

Slide 7 text

ファイルアップロードに潜む脅威 7

Slide 8

Slide 8 text

8 ファイルアップロードに潜む脅威 MIME type spoofing Remote Code Execution (RCE) 蓄積型XSS 無制限ファイルアップロード攻撃 パストラバーサル攻撃 画像処理ライブラリの脆弱性悪用 ファイルインクルージョン攻撃 WebShell アップロード Polyglot File Attack メタデータインジェクション NULLバイト攻撃

Slide 9

Slide 9 text

● 概要: ブラウザがファイルの内容からMIMEタイプを推測する挙動 ● 危険性: MIMEタイプを偽装した悪意のあるファイルがスクリプト として実⾏される可能性 9 MIME Sniffingによる脆弱性

Slide 10

Slide 10 text

● 概要: 攻撃者が任意のコードをサーバー上で実⾏できる脆弱性 ● 危険性: 悪意あるコードの実⾏ データベース情報の窃取、システム破壊、侵⼊の踏み台利⽤ ※ 最も深刻な被害が⽣まれやすい 10 Remote Code Execution (RCE)

Slide 11

Slide 11 text

11 パストラバーサル攻撃 ● 概要: 攻撃者が意図的に細⼯したファイル名やパスを使⽤し、想定 外の場所にファイルを保存させたり、システムの重要なファイル を上書きしたりする攻撃 ● 危険性: 設定ファイルの改ざん、ファイル配置によるコード実⾏

Slide 12

Slide 12 text

12 画像処理ライブラリの脆弱性悪⽤ ● 概要: 画像処理ライブラリ(ImageMagick、libpng…)の脆弱性を悪 ⽤した攻撃を⾏う。 ● 危険性: サーバー上で任意のコードが実⾏される サービス拒否(DoS)

Slide 13

Slide 13 text

13 Polyglot File Attack ● 概要: 複数のファイル形式として同時に解釈可能なファイルを作成 セキュリティチェックを回避する攻撃⼿法 ● 危険性: XSS、リモートコード実⾏、サーバー侵害

Slide 14

Slide 14 text

デモンストレーション 14

Slide 15

Slide 15 text

● Content-Typeを偽装して、HTMLをアップロード ● ファイルを開くとスクリプトが実⾏ (XSS攻撃: Cookie / Sessionの漏洩) 15 MIME Sniffing デモンストレーション Demonstration

Slide 16

Slide 16 text

16 RCE デモンストレーション Demonstration ● ファイル名に任意のコマンドを埋め込みアップロード ● コマンドが実⾏されてしまう(RCE)

Slide 17

Slide 17 text

17 パストラバーサル デモンストレーション Demonstration ● ファイル名に「../../logo.png」のようなパス操作⽂字 列を含める ● 意図したディレクトリの外にファイルが保存され、重 要なシステムファイルが上書きされてしまう

Slide 18

Slide 18 text

実装のベストプラクティス 18

Slide 19

Slide 19 text

● フロントエンドでできることは「補助的な対策」のみ ● 根本対応にはサーバーサイドの対策が必須! 19 前提

Slide 20

Slide 20 text

● マジックバイトでのファイル検証 ● 拡張⼦チェックは許可⽅式にする ● 正規表現による検証は回避可能なパターンが⽣じやす いため、完全⼀致や、RFC標準仕様に準拠した検証 ● ライブラリを⽤いて、ファイル名やMIMEタイプを安全 な形式に正規化‧サニタイズする 20 厳密な検証とサニタイゼーション

Slide 21

Slide 21 text

21 X-Content-Type-Options を指定する ● ブラウザによる⾃動的なContent-Type推測を防⽌し、 サーバーが指定したContent-Typeを厳密に適⽤させる ● 攻撃者がアップロードしたファイルを意図しない形式 として実⾏させる攻撃を防⽌する

Slide 22

Slide 22 text

22 ファイル配信⽤のドメインを分離する ● ファイル配信を⾏うドメインを分離する • アプリケーションドメイン(google.com) • ファイル配信ドメイン(googleusercontent.com) ● XSSなどの脆弱性が発⽣した場合でも、攻撃者がセッ ションCookieや認証情報を窃取することが困難にな り、被害範囲を最⼩限に抑えられる

Slide 23

Slide 23 text

● ディレクトリでのスクリプト実⾏権限を無効化 ● 画像処理ライブラリを最新に保つ ● ウイルススキャンの実施 23 サーバー環境の保護

Slide 24

Slide 24 text

まとめ 24

Slide 25

Slide 25 text

適切なセキュリティ対策を⾏い 安⼼‧安全なシステム開発を、実現しよう! 25

Slide 26

Slide 26 text

脆弱性体験アプリケーションをGitHubで公開しています。 26 デモンストレーションコード

Slide 27

Slide 27 text

● The Web Application Hacker's Handbook ● 体系的に学ぶ 安全なWebアプリケーションの作り⽅ 第2版 27 参考⽂献

Slide 28

Slide 28 text

ご静聴ありがとうございました 28 \\ エンジニア採⽤強化中!! ∕∕ 気になる⽅は登壇メンバーまで! @doskoi64 / @yukyan_p / @penpeen