# M7 - 脆弱なコード品質

## 脅威エージェント

**アプリケーション依存**

脅威エージェントにはモバイルコード内で行われるメソッドコールに信頼できない入力を渡すことができるエンティティがあります。これらのタイプの問題は必ずしもそれ自体のセキュリティ問題ではないのですが、セキュリティ脆弱性につながります。例えば、古いバージョンのSafariではバッファオーバフロー(脆弱なコード品質の脆弱性)が発生したため、ドライブバイジェイルブレイク攻撃のリスクが高くなりました。脆弱なコード品質の問題は一般的にマルウェアやフィッシング詐欺によって悪用されます。

## 攻撃手法

**悪用難易度 困難**

攻撃者は一般的に慎重に作り上げた入力をいけにえに与えることでこのカテゴリの脆弱性を悪用します。これらの入力は悪用が行われるモバイルデバイス内にあるコードに渡されます。よくあるタイプの攻撃ではメモリリークやバッファオーバーフローを悪用します。

## セキュリティ上の弱点

**普及度 中**\
**検出難易度 困難**

コード品質の問題は多くのモバイルコードのいたるところにみられます。良い知らせとしては多くのコード品質の問題はまったく無害であり不正なプログラミングプラクティスであるということです。手動でのコードレビューによりこれらのタイプの問題を検出することは一般的に困難です。代わりに、攻撃者は静的解析やファジングを実行するサードパーティツールを使用します。これらのタイプのツールは一般的にメモリリーク、バッファオーバーフロー、その他の不正なプログラミングプラクティスを引き起こす重大ではない問題を特定します。極度に低レベルの知識と技術を持つハッカーはこれらのタイプの問題を効果的に悪用します。典型的な主な目標はモバイルコードのアドレス空間内で外部コードを実行することです。

## 技術的影響

**影響度 中程度**

このカテゴリに該当するほとんどの悪用は (モバイルデバイス自体ではなく) リモートサーバーエンドポイントでの外部コード実行やサービス拒否を招きます。しかし、バッファオーバーフロー/オーバーランがモバイルデバイス内に存在し、入力が外部パーティからもたらされる場合、これは技術的影響が非常に大きく、修正されるべきです。

## ビジネスへの影響

**アプリケーション / ビジネス依存**

このカテゴリの脆弱性によるビジネスへの影響は悪用の性質によって大きく異なります。リモートコード実行をもたらす脆弱なコード品質の問題は以下のビジネスへの影響を引き起こす可能性があります。

* 情報漏洩
* 風評被害
* 知的財産漏洩

このカテゴリに該当する他の重大ではない技術的問題には、パフォーマンス、メモリ使用量、脆弱なフロントエンドアーキテクチャの悪化を招く可能性があります。

## '脆弱なコード品質' の脆弱性があるか？

これはモバイルクライアントにおけるコードレベルの実装の問題に対するあらゆるものに対応します。これはサーバー側のコーディングミスとは異なります。モバイルデバイス上で実行しているコードを書き換えるソリューションであるバッファオーバーフロー脆弱性、フォーマット文字列脆弱性、その他のさまざまなコードレベルの間違いによるリスクを捕捉します。

これはたいてい (Java, Swift, Objective C, JavaScript などの) プログラミング言語そのものに言及するため、不適切なプラットフォームの利用とは異なります。C でのバッファオーバーフローや WebView モバイルアプリでの DOM ベースの XSS はコード品質の問題です。

このリスクの重要な特徴は、コードがモバイルデバイス上で実行されること、およびコードが非常に限定された方法で変更する必要があることです。ほとんどのリスクを改善するにはコードを変更する必要がありますが、コード品質の場合、リスクには間違った API を使用すること、安全でない方法で API を使用すること、安全でない言語構造を使用すること、そのほかのコードレベルの問題があります。重要：これはサーバー上で実行されているコードではありません。これはモバイルデバイス自体で実行される不正なコードを捕捉するリスクです。

## '脆弱なコード品質' を防ぐには？

一般的に、コード品質の問題は以下を行うことで回避できます。

* 組織内の全員が同意する一貫したコーディングパターンを維持する。
* 読みやすく文書化されたコードを書く。
* バッファを使用する場合、常に受信バッファデータの長さがターゲットバッファの長さを越えないことを確認する。
* 自動化により、サードパーティの静的解析ツールを使用してバッファオーバーフローとメモリリークを特定する。
* 他の 'コード品質' 問題よりもバッファオーバーフローとメモリリークを優先して解決する。

## 攻撃シナリオの例

**シナリオ #1:** バッファオーバーフローの例:

```
include <stdio.h>

 int main(int argc, char **argv)
 {
    char buf[8]; // buffer for eight characters
    gets(buf); // read from stdio (sensitive function!)
    printf("%s\n", buf); // print out data stored in buf
    return 0; // 0 as return value
 }
```

[この](https://www.owasp.org/index.php/Buffer_overflow_attack) ページから取得したこの例では、バッファオーバーフローを避けるために gets 関数の利用を避けるべきです。これは多くの静的解析ツールがコード品質の問題として報告するものの一例です。

## 参考資料

* OWASP
  * [Buffer Overflow Examples](https://www.owasp.org/index.php/Buffer_overflow_attack)
* その他
  * [External References](http://cwe.mitre.org/)
