権限昇格

**権限昇格**（けんげんしょうかく、）とは、オペレーティングシステムやアプリケーションソフトウェアにおけるバグ、設計上の欠陥、あるいは設定の不備を悪用し、通常はアプリケーションやユーザーから保護されているリソースへの昇格されたアクセス権を得る行為である。その結果、アプリケーション開発者やシステム管理者が意図した以上の権限を持つアプリケーションやユーザーが、許可されていない操作を実行できてしまう。権限昇格を実行する攻撃を**特権昇格攻撃**ということもある。

## 概要
ほとんどのコンピュータシステムは、複数のユーザーアカウントで使用されるように設計されており、各アカウントには権限として知られる能力が割り当てられている。一般的な権限には、ファイルの閲覧や編集、システムファイルの変更などがある。

権限昇格とは、ユーザーが本来与えられていない権限を受け取ることを意味する。これらの権限は、ファイルの削除、プライベートな情報の閲覧、あるいはウイルスのような望ましくないプログラム（マルウェア）のインストールに利用される可能性がある。これは通常、システムにセキュリティを迂回できるバグがある場合や、あるいはシステムがどのように使用されるかについての設計上の想定に欠陥がある場合に発生する。権限昇格には2つの形態がある。

* **垂直的権限昇格**（）は、「権限昇格」（）とも呼ばれ、より低い権限のユーザーやアプリケーションが、より高い権限のユーザーやアプリケーションのために予約された機能やコンテンツにアクセスする場合（例：インターネットバンキングの利用者がサイトの管理機能にアクセスできる、スマートフォンのパスワードを迂回できるなど）。
* **水平的権限昇格**（）は、ある一般ユーザーが、他の一般ユーザーのために予約された機能やコンテンツにアクセスする場合（例：インターネットバンキングのユーザーAがユーザーBの銀行口座にアクセスするなど）。

## 垂直的権限昇格

この種の権限昇格は、ユーザーやプロセスが管理者やシステム開発者が意図したよりも高いレベルのアクセス権を取得できた場合に発生し、場合によってはカーネルレベルの操作を実行することによって行われる。

### 例
* 高権限のアプリケーションが、そのインタフェース仕様に一致する入力のみが提供されると想定し、この入力を検証しない場合がある。攻撃者はこの想定を悪用し、アプリケーションの権限で不正なコードを実行できる可能性がある。
** 一部のWindowsサービスは、Local Systemユーザーアカウントで実行されるように設定されている。バッファオーバーフローのような脆弱性を利用して、Local Systemに昇格した権限で任意のコードを実行することができる。あるいは、より低い権限のユーザーを偽装しているシステムサービスが、ユーザー偽装中にエラーが正しく処理されない場合（例えば、ユーザーが悪意のあるエラーハンドラを導入した場合）、そのユーザーの権限を昇格させてしまう可能性がある。
* Microsoft Windowsオペレーティングシステムの一部の古いバージョンでは、全ユーザー共通のスクリーンセーバーがLocal Systemアカウントで実行される。そのため、ファイルシステムやレジストリ内の現在のスクリーンセーバーのバイナリを置き換えることができるアカウントは、権限を昇格させることが可能である。
* kprocesshacker.sysのようなWindowsのドライバを使用すると、cmd.exeのようなプログラムを組み込みアカウントとして実行でき、TrustedInstallerへのアクセスも可能になる。別の方法として、winring0.sysのようなカーネルドライバを使用してカーネルアクセス権でプログラムを実行する方法がある。このドライバは、UACを迂回して管理者としてプログラムを実行するために悪用されることもある。
* Linuxカーネルの特定のバージョンでは、カレントディレクトリを`/etc/cron.d`に設定し、クラッシュした場合にコアダンプを実行するよう要求し、別のプロセスによって自身を強制終了させるプログラムを書くことが可能であった。コアダンプファイルはプログラムのカレントディレクトリ、つまり`/etc/cron.d`に置かれ、`[[cron]]`はそれをスケジュール通りにプログラムを実行するよう指示するテキストファイルとして扱った。ファイルの内容は攻撃者の制御下にあるため、攻撃者は任意のプログラムをroot権限で実行することができた。
* クロスゾーンスクリプティングは、権限昇格攻撃の一種であり、ウェブサイトがウェブブラウザのセキュリティモデルを破壊し、クライアントコンピュータ上で悪意のあるコードを実行させることを可能にする。
* アプリケーションが他の高権限サービスを利用でき、クライアントがこれらのサービスの使用をどのように操作できるかについて誤った想定をしている状況もある。コマンドラインやシェルコマンドを実行できるアプリケーションは、検証されていない入力を実行コマンドの一部として使用する場合、シェルインジェクションの脆弱性を持つ可能性がある。攻撃者は、アプリケーションの権限を使用してシステムコマンドを実行できるようになる。
* テキサス・インスツルメンツ社の電卓（特にTI-85やTI-82）は、当初TI-BASICの方言で書かれたインタプリタ型プログラムのみを使用するように設計されていた。しかし、ユーザーが電卓のハードウェア上でネイティブのZ80コードを実行できるバグを発見した後、TIはサードパーティー開発をサポートするためにプログラミングデータを公開した。（これはARMベースのTI-Nspireには引き継がれず、Ndlessを使用したジェイルブレイクが発見されているが、テキサス・インスツルメンツ社によって依然として積極的に対抗されている。）
* iPhoneの一部のバージョンでは、ロックされた状態の電話機に権限のないユーザーがアクセスできてしまう。

### ジェイルブレイク
コンピュータセキュリティにおいて、**ジェイルブレイク**（）とは、ベンダーがソフトウェアやサービスにハードコードしようとした制限を取り除く行為と定義される。一般的な例として、UNIX系オペレーティングシステムにおいてchrootやjailから脱出するためのツールセットの使用や、デジタル著作権管理 (DRM) の迂回が挙げられる。前者の場合、管理者がアプリケーションや当該ユーザーに利用可能にしようと意図したファイルシステムの外にあるファイルをユーザーが見ることができるようになる。DRMの文脈では、これによりユーザーはDRMが適用されたデバイス上で任意に定義されたコードを実行したり、chrootのような制限から脱出したりすることが可能になる。この用語はiPhone/iOSのジェイルブレイクコミュニティから生まれ、PlayStation Portableのハッキングの用語としても使用されている。これらのデバイスは繰り返しジェイルブレイクの対象となり、任意コードの実行が可能になったが、ベンダーのアップデートによってジェイルブレイクが無効にされることもある。

iPhone、iPad、iPod Touchを含むiOSシステムは、リリース以来、ファームウェアのアップデートごとにiOSジェイルブレイクの試みの対象となってきた。iOSのジェイルブレイクツールには、システムの調整やバイナリを見つけてインストールする方法として、App Storeのサードパーティー製代替品であるCydiaやInstaller.appのようなパッケージフロントエンドをインストールするオプションが含まれている。iOSのジェイルブレイクを防ぐため、AppleはデバイスのブートROMにSHSH blobのチェックを実行させ、カスタムカーネルのアップロードを不許可にし、より古いジェイルブレイク可能なファームウェアへのソフトウェアダウングレードを防止している。「完全な（untethered）」ジェイルブレイクでは、iBoot環境が変更され、ブートROMのエクスプロイトを実行し、パッチが適用された低レベルのブートローダーの提出を許可したり、SHSHチェック後にジェイルブレイクされたカーネルを提出するためにカーネルをハックしたりする。

同様のジェイルブレイク方法はS60 Platformスマートフォンにも存在し、HelloOXのようなユーティリティが未署名コードの実行とシステムファイルへの完全なアクセスを可能にする。また、未署名コードへの制限を回避するために編集されたファームウェア（PlayStation Portableで使用されたM33ハックファームウェアに類似）も使用される。ノキアはその後、Appleと同様の方法で、不正なジェイルブレイクを抑制するためのアップデートをリリースしている。

ゲーム機の場合、ジェイルブレイクは自作ソフトを実行するためによく使われる。2011年、ソニーは法律事務所Kilpatrick Stocktonの協力を得て、21歳のジョージ・ホッツとグループfail0verflowの仲間をPlayStation 3をジェイルブレイクしたとして提訴した。

ジェイルブレイクは、ChatGPTなどの生成系AIを使用するソフトウェアでも発生する可能性がある。生成系AIへのジェイルブレイク攻撃では、ユーザーがモデルを操作してプログラムされたものとは異なる振る舞いをさせることができ、モデルがどのように指示されたかに関する情報を明らかにしたり、異常なまたは有害な方法で応答させたりすることが可能になる。

### Android
Androidスマートフォンは、メーカーが管理するプロセスを経るか、エクスプロイトを利用してroot権限を取得するか、またはroot化のための改造をインストールすることによって公式にroot化できる。メーカーは自社が管理するプロセスを通じてroot化を許可しており、中には起動時に特定のキーの組み合わせを押すことや、その他の自己管理による方法で簡単にroot化できるものもある。メーカーの方法を使用すると、ほとんどの場合、デバイスは工場出荷状態にリセットされ、データを閲覧したい人々にとってはroot化が無意味になる。また、デバイスのroot化を解除して再フラッシュしても、保証は永久に無効となる。ソフトウェアのエクスプロイトは、一般的にユーザーがアクセス可能なrootレベルのプロセスを標的とし、スマートフォンのカーネルに特有のエクスプロイトを使用するか、新しいバージョンではパッチが適用されている既知のAndroidのエクスプロイトを利用する。これは、スマートフォンをアップグレードしないか、意図的にバージョンをダウングレードすることによって行われる。

### 緩和策

オペレーティングシステムやユーザーは、以下の戦略を用いて権限昇格のリスクを低減できる。
* データ実行防止 (DEP)
* ASLR（アドレス空間配置のランダム化）（バッファオーバーフローがメモリ内の既知のアドレスで特権命令を実行するのを困難にするため）
* 最小権限の原則でアプリケーションを実行する（例えば、プロセスのトークン内で管理者SIDを無効にしてInternet Explorerを実行する）ことで、バッファオーバーフローエクスプロイトが昇格されたユーザーの権限を悪用する能力を低減する。
* カーネルモードのコードにデジタル署名を要求する。
* パッチの適用
* バッファオーバーランをトラップするコンパイラの使用
* ソフトウェアやファームウェアコンポーネントの暗号化。
* SELinuxのような強制アクセス制御（MAC）を持つオペレーティングシステムの使用
* カーネルデータ再配置メカニズム（実行中のカーネル内の特権情報を動的に再配置し、メモリ破壊を利用した権限昇格攻撃を防ぐ）
最近の研究では、権限昇格攻撃に対して効果的に保護できるものが示されている。これには、OSの脆弱性に焦点を当てた攻撃を特に防ぐための追加カーネルオブザーバー (AKO) の提案が含まれる。研究によると、AKOは実際に権限昇格攻撃に対して効果的であることが示されている。

## 水平的権限昇格
水平的権限昇格は、アプリケーションが攻撃者に、通常はそのアプリケーションやユーザーから保護されているはずのリソースへのアクセスを許可した場合に発生する。その結果、アプリケーションは同じユーザーでありながら、アプリケーション開発者やシステム管理者が意図したものとは異なるセキュリティコンテキストでアクションを実行する。これは事実上、限定的な形態の権限昇格（具体的には、他のユーザーになりすます能力の不正な取得）である。垂直的権限昇格と比較して、水平的権限昇格はアカウントの権限を昇格させる必要がない。多くの場合、システムのバグに依存する。

### 例
この問題はウェブアプリケーションで頻繁に発生する。以下の例を考える。
* ユーザーAは、インターネットバンキングアプリケーションで自身の銀行口座にアクセスできる。
* ユーザーBは、同じインターネットバンキングアプリケーションで自身の銀行口座にアクセスできる。
* ユーザーAが何らかの悪意のある活動を行うことで、ユーザーBの銀行口座にアクセスできた場合に脆弱性が発生する。

この悪意のある活動は、一般的なウェブアプリケーションの弱点や脆弱性によって可能になる場合がある。

この状態につながる可能性のあるウェブアプリケーションの脆弱性や状況には、以下のようなものがある。
* ユーザーのHTTP cookieに含まれる予測可能なセッションID
* セッション固定攻撃
* クロスサイトスクリプティング
* パスワード
* セッションクッキーの盗難またはハイジャック
* キーロガー

## 脚注

## 関連項目
* コンピュータセキュリティ
* セキュアプログラミング
* オーバーフロー
* 最小権限の原則