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

アプリに潜む脆弱性 - LINEの場合 - / Vulnerability latent in LINE android app

アプリに潜む脆弱性 - LINEの場合 - / Vulnerability latent in LINE android app

Androidアプリケーションのセキュリティと聞かれて皆さんは何を思い浮かべるでしょうか? データの暗号化・ProGuard/R8といったコード難読化・不正購入、はたまたAndroid本体のセキュリティなど様々な要素が挙がるでしょう。 今回はその中でも特に「脆弱性」にフォーカスしてみます。 Android OSやライブラリに含まれていることもありますが、何気なく書いたあなたのコードが原因になっているかもしれません。 ついつい書いてしまいがちなコードの中に脆弱性につながる書き方が潜んでいることは多々としてあります。 実際に、LINEのAndroidアプリでも書かれたコード上に脆弱性があり、脆弱性報奨金制度「LINE Security Bug Bounty Program」での報告や内部チェックで発見・修正をしてきました。 では、実際にどのような脆弱性がAndroidアプリに混入してしまったのでしょうか? このセッションでは、LINEのAndroidアプリに含まれていた脆弱性の紹介を行います。また、それらの脆弱性に対してどのような対策を講じたか紹介を行います。

LINE Developers

April 28, 2020
Tweet

More Decks by LINE Developers

Other Decks in Technology

Transcript

  1. LINEにおける脆弱性対策 • PRレビューなどによる相互のチェック • 専門のチームによるレビュー • API設計 • 実装コードのチェック •

    ステージング環境でのチェック • 社外報告者からの報告のチェック 1. 社内でのチェック
  2. LINEにおける脆弱性対策 • LINE Security Bug Bounty Program を実施 • 有効な脆弱性報告に対し、報奨金を支払う

    • https://hackerone.com/line • LINE Android は Google Play Security Reward Program の対象 • Google Play上の著名なアプリに対して対象 • https://www.google.com/about/appsecurity/play-rewards/ 2. 社外報告者による報告
  3. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  4. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  5. #1 SQL Injection SQLクエリの生成時に不正なクエリを発行できる脆弱性 val input = "t' OR 't'

    = 't" val sql = "SELECT * FROM users WHERE name = '${input}';” db.rawQuery(sql, null) // 実際に実行されるSQL文 SELECT * FROM users WHERE name = 't' OR 't' = 't';
  6. #1 SQL Injection • SQLiteDatabaseクラスのプレースホルダーを使用する • Room等のフレームワークを使用する 対策 @Query("SELECT *

    FROM users WHERE id = :id") fun getUser(id: String): User val selection = "id = ?" db.query(table, selection, arrayOf(id))
  7. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  8. #2 SQLite Journal Mode • トランザクション中の操作を管理するための方法 • WAL • トランザクション開始~終了までを「-shm」ファイルへ、コミット時

    に「-wal」ファイルに、closeしたときに本体へ書き込む • DELETE • トランザクション開始~終了までを「-journal」ファイルへ、コミット 時に本体へ書き込む • Journalファイルはコミット時に削除する PRAGMA journal_mode=DELETE
  9. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  10. #3 WebViewからのリソースアクセス • 中間者攻撃により、WebViewのリソースの差し替えが可能 • JavaScript経由で、アプリ内のデータの盗聴、書き換えが可能 • JPCERT/CC および IPA

    からの報告、BugBounty 経由での報告 • 2015年に修正 • 公式サイトでも脆弱性の修正の告知を行った • http://official-blog.line.me/ja/archives/24809761.html 概要
  11. #3 WebViewからのリソースアクセス • 読み込むリソースのHTTPS化 • どうしても難しい場合は、外部ブラウザで開くようにする • Android 9からはHTTPSが基本に •

    WebViewのJavaScript機能の無効化 • 不必要なCordovaのプラグインの削除 対策 webview.settings.isJavaScriptEnabled = false
  12. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  13. #4 書換可能なファイルでのデバッグフラグ • フラグを書き換え可能な状態にしない • BuildConfig と productFlavor/buildType による制御 •

    書換えがどうしても必要な場合はReleaseビルドで無効になるよ うにする • productFlavor/buildType による制御 対策 val fooFlag = if (BuildConfig.DEBUG) { // load from file } else { false }
  14. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  15. #5 TextViewでのHTMLタグ • 特殊文字をエスケープする 対策 val escapedInviterName = inviterName .replace("<",

    "&lt;") .replace(">", "&gt;") // snip getString(R.string.invited, escapedInviterName)
  16. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  17. #6 双方向テキストによるリンク偽装 • トークルーム内で送信できるリンク • 双方向テキスト文字による偽装が可能だった e.g. U+202E: Right to

    Left override / 強制的に左向きテキスト • 見た目のリンクとは別のページを開かせることができる • BugBounty経由での報告 • 2020年に修正 概要 example.com/pix[U+202E]gpj.apk ↓ example.com/pixkpa.jpg
  18. #6 双方向テキストによるリンク偽装 • androidx-coreのLinkifyCompatを使用する • RFC 3987 (国際化URI) で禁止されている文字を弾いてくれる •

    実際には内部で使用している PatternsCompat に定義があるが、こちら は hide API になっている • ただし、リンクを使用して更になにかしたい場合には不向き 対策 LinkifyCompat.addLinks(spannableText)
  19. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  20. #7 ネイティブコードでの整数オーバーフロー • LINEが出してるOSSの ApngDrawable を皮切りに発見 https://engineering.linecorp.com/ja/blog/intern-report-line-client/ • LINE 内で使用している他フォーマットのデコーダにも同様の問

    題があった • ApngDrawableとLINE Android両方にCVEを発行する事になった • https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-6007 • https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-6010 余談
  21. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  22. LINE Android にあった脆弱性の紹介 1. SQL Injection 2. SQLite Journal Mode

    3. WebViewからのリソースアクセス 4. 書換可能なファイルでのデバッグフラグ 5. TextViewでのHTMLタグ 6. 双方向テキストによるリンク偽装 7. ネイティブコードでの整数オーバーフロー 8. パストラバーサル 9. ZIPファイル関連
  23. まとめ • きちんと脆弱性のチェックを行いましょう • 社内でのチェック • Bounty Programのような社外からの報告 • 報告を受けた脆弱性はきちんと直しましょう

    • サービスの安定運用の妨げになったり、何より情報漏えい等、ユー ザーが被害を被る可能性があります。