2020年の全世界的な新型コロナウィルス感染症の拡散による産業パラダイムの変化はサイバー攻撃にも多くの影響を与えた。国家機関の詐称及び新型コロナウィルスに関するイシューを利用したフィッシング攻撃を始めにランサムウェア事件、サプライチェーン(Supply Chain)攻撃を誘発したSolarWindws事態まで、攻撃の範囲と方法が多様化した年ともいえる。
非対面環境の増加による攻撃対象領域(Attack Surface)の増加はメールやホームページなどを利用し内部に侵入し、2次的な被害を引き起こす攻撃が作られた。そのため攻撃者の攻撃行為、特性、手法などに対する分析を行い攻撃を認知し、対応する体系的なプロセスの重要性が日々高まっている。この流れは、攻撃者の特性を分析して作られた「サイバー攻撃ライフサイクル(Cyber Attack Life Cycle)」を対応戦略に利用する研究を活発化させている。
【▲ Cyber Attack LifeCycle(参考:MITRE)】
サイバー攻撃ライフサイクルの中でも特権エスカレーション(Privilege Escalation)攻撃は2次被害を誘発させる転換点となる攻撃である。 一般的に重要資産は、内部ネットワーク環境で運用されている。 このような重要資産のアクセスが攻撃範囲の広さを左右するため、外部ネットワークからのアクセス権限を獲得した攻撃者は攻撃効果を最大化するために内部ネットワークへのアクセスが必要とする。 結局、Criticalな被害を与えるためには、より多くの権限が必要となり、攻撃者は重要権限ユーザーやターゲットを確保するラテラル・ムーブメント(Lateral Movement)と特権エスカレーション攻撃を通じて主要権限獲得を試みることになる。
攻撃者のメカニズムを整理した基準で「MITRE ATT&CK Matrix」が活用されている。
MITRE ATT&CKからは攻撃のライフサイクルの各部分を戦術(Tactics)にわけて各戦術別に良く利用される攻撃TechniqueをMatrixに定義した。その中、特権エスカレーションの戦術は下記の12個のTechniqueが含まれている。
No | Technique | Description |
---|---|---|
1 | Abuse Elevation Control Mechanism | 権限を制御するメカニズムをバイパスして上位の権限を獲得 |
2 | Access Token Manipulation | Windowsから実行中のプロセスの所有権を確認するアクセストークンを操作して上位の権限を獲得 |
3 | Boot or logon Autostart Execution | Booting/Loginの際、特定のプログラムを自動で実行されるようにシステム設定を操作して上位の権限を獲得 |
4 | Boot or logon Initialization Scripts | Booting/Loginの初期化の際、自動で実行されるスクリプトを利用して上位の権限を獲得 |
5 | Create or Modify System Process | システムプロセスが主に管理者権限で生成されるが、root/SYSTEM権限で実行される特徴を利用した権限獲得方法 |
6 | Domain Policy Modification | ドメイン構成の設定を収集し、ポリシーをバイパスしてドメイン環境から上位の権限を獲得 |
7 | Event Triggered Execution | 更に高い権限が要求される特定イベントの実行を誘発するメカニズムを利用して上位の権限を獲得 |
8 | Exploitation for Privilege Escalation | 既存プログラムの脆弱性もしくは、システム権限を上昇する不正プログラムを利用して上位の権限を獲得 |
9 | Hijack Executor Flow | OSがプログラムを実行する流れを横取りして不正ペイロードを実行及び挿入して上位の権限を獲得 |
10 | Process Injection | 正常プロセスのアドレススペースに任意のコードを挿入及び実行してセキュリティ検知をバイパスして上位の権限を獲得 |
11 | Scheduled Task/Job | 作業スケジューリング機能を悪用して不正プロセスを実行予約して上位の権限を獲得 |
12 | Valid Accounts | 有効なアカウントの資格証明を取り、初期アクセス権限を保ち、これを利用して持続的にデータを収集して上位の権限を獲得 |
【▲ 特権エスカレーション(Privilege Escalation)戦術に利用されるTechniquesリスト(参考:MITRATT&CK for Enterprise)】
システムメカニズムの脆弱性を利用して上位権限を獲得する「Control Mechanism Technique」は4つのSub-Technique; △SetUID/SetGID操作、△UAC(User Access Control) バイパス、△資格証明API AuthorizationExecuteWithPrivilegesの活用、△sudoユーティリティに分類される。この4つのSub-Techniqueのなかsudoユーティリティを利用して特権エスカレーション脆弱性は成功時、影響度が高いためこれを深層的に分析しようとする。
sudoは管理者がsudoersファイルに記述された一般ユーザーに制限されたスーパーユーザとしての権限を付与してシステムを利用できるようにしてくれるUnix/Linux基盤のOSのシステムユーティリティである。 管理者権限にアクセスを提供するユーティリティであるため、sudoユーティリティは持続的に攻撃者の特権エスカレーションの手段として利用され、いくつかの脆弱性が発見されてきた。
2021年1月に発表されたCVE-2021-3156は、約10年前のバージョンのsudoユーティリティから存在していた脆弱性で、パッチ以前の全てのバージョンのsudoに存在することが確認された。基本的にsudo はユーザーパスワード及びrootパスワードに対する検証が存在するが、当該の脆弱性ではバッファオーバーフローを利用してバイパスができるため、CVSS点数7.8に達するリスクホールに分類された。2019年に発見されたCVE-2019-14287は、UID値を変更してsudoユーザー制限がバイパスできるため、CVSS点数8.8に分類された。
このように、ここ5年間でsudoと関連したCVEが53件発表され、このうちリスクレベルがHigh以上のCVEは46件である。このリスクレベル、sudoに関する脆弱性バッチの不備及び対応不在時にシステムに与える影響がどれだけ高いかを知る指標と言える。
【▲ sudoに関するCVE統計(参考:CVE List)】
sudoに関する特権エスカレーションの脆弱性の多くは他のプログラムに存在する脆弱性を利用して権限確認をバイパスする形態である。しかし、CVEリストはsudoに関する特権エスカレーションの脆弱性の中でもsudoユーティリティ自体に存在する脆弱性を利用した資料である。
特定の環境から脆弱性が発現するのではなく、影響を受けるバージョンのsudoユーティリティを使用するだけでも危険にさらされるため、一般的なsudo脆弱性に比べてリスクが高いため、詳細分析を進めようとしている。今回は、これらの中でCVE-2019-14287とCVE-2019-18634の脆弱性について紹介する。
No | CVE | Description |
---|---|---|
1 | CVE-2015-5602 | sudoeitに入力するファイルのパスにワイルドカード文字(*)を使用して上位権限のファイル修正 |
2 | CVE-2016-7076 | wordexp関数に特定の因子を使用する応用プラグラムを実行してnoexec制限オプションが存在するsudoをバイパスして上位権限を獲得 |
3 | CVE-2017-1000367 | SELinuxモジュールが有効化されたシステムから有効性検証不備て制限された権限のsudoerが完全なroot権限を獲得 |
4 | CVE-2019-14287 | -uオプションの入力値の検証が不備な脆弱性を利用してコマンドを実行し、上位権限を獲得 |
5 | CVE-2019-18634 | pwfeedbackオプションが有効化されたsudoプロセスからパスワード入力値にオーバフローを起こして上位権限を獲得 |
6 | CVE-2021-3156 | sudoにバックスラッシュ文字に対するバッファオーバーフローが存在し、これを利用してroot権限を獲得 |
【▲ sudo関連CVE統計(参考;CVE List)】
CVE-2019-14287は2019年10月Apple Information Security TeamのJoe Vennixが発見し、この脆弱性は一般ユーザーにsudoを許可していないポリシーが適用されたシステムからバイパスしてroot権限の獲得ができる。sudoユーティリティを使用してるほぼ全てのUnix/Linux環境からexploitが可能である。
区分 | 脆弱なバージョン | 危険度 |
---|---|---|
CVE-2019-14287 | 1.8.31バージョン以下のsudoユーティリティを使用しているUnix/Linux | High (CVSS 8.8) |
【▲ CVE-2019-14287紹介】
システム管理者はsudoユーティリティに対するセキュリティポリシーで/etc/sudoersファイルを修正して許可されたユーザーのみコマンドが使えるようにできる。sudoer設定はユーザー/グループ名(%group name)、ホスト、コマンドで構成され、特定のユーザー(グループ)がsudoを利用して使用できるコマンドもしくは、あるユーザー(グループ)の権限などを明示して制限できる。下記の例の場合、ALLホストからアクセスしたiglooというアカウントがudoコマンドを使用した場合、rootを除いてすべてのアカウント名でviプログラムをパスワードなして利用できる。
【▲ /etc/sudoersポリシーの設定例】
/etc/sudoersに設定された特定のユーザーでsudoコマンドを使用する際、-uオプションはユーザー名もしくは、UID値を因子として使用する。1.8.28バージョン以下のユーティリティではUIDを因子値で負数または、正数の最大値を入力された場合、検証不備でCVE-2019-14287脆弱性がexploit可能である。
straceコマンドを利用してsudo -uオプションに-1因子値を入力した時発生する反応は以下のようにsetreuid()関数が使用されたことが確認できる。setreuid関数は3つのUID(ruid, euid, suid)を因子値で受けて変更する関数である。
【▲ sudo反応追跡】
当該の脆弱性から発生したsetresuid(4294967295, 4294967295, 4294967295)のテストの結果は以下のようにUIDが0(root)に変更されたことが確認できる。
【▲ setreuidテストコード】
この脆弱性はsudo開発チームからセキュリティパッチバージョンを配布された。パッチ内容は「sudoパス」/lib/stroid.hのコードが修正された。/lib/stroid.hからstroll関数を通じて入力された文字列(p)をlong long整数型に変換する。
削除された2.56:2.61ラインを確認すると入力文字列(p)とep(end pointer)が同じではない場合だけ有効値として認定されエラーが発生しない。pとepが同一である場合(因子になにも入力されていない)は2.68ラインのif文が適用された2.78:2.81ラインのエラーが出力された終了される。
つまり、どこでも負数と正数の最大値が入力された時のエラー処理は存在しないため、2.77ラインが追加されて負数と正数の最大値が入力された時処理ではない値と認識してエラーが発生されるようにパッチされた。
【▲ セキュリティパッチ内容(参考:sudo.ws)】
攻撃者Aはアカウントiglooでサーバのアクセスに成功した。しかしシステム管理者がsudoに対するセキュリティ対策でiglooのアカウントにsudoの権限を制限的に設定してAが獲得したiglooの権限はサーバに直接的な被害を与える方法は存在しない。そのため、AはCVE-2019-14287脆弱性を利用してroot権限を獲得しようとする。
区分 | 環境別バージョン |
---|---|
Server OS | RHEL 7.2 (192.168.0.138) |
sudo Version | 1.8.6p7 |
アクセスアカウント | igloo |
【▲ 攻撃試演環境】
【▲ システムに設定されているsudoersポリシー】
(1) 上位権限を利用するために/bin/bashでアクセスを試すがsudoersポリシーによって/bin/bashの実行権限がないiglooアカウントは下記のメッセージが表示、shellにアクセスはできない。
【▲ システムに設定されたsudoersポリシー】
(2) sudo -Vコマンドを入力した結果、攻撃者Aは侵入したシステムがCVE-2019-14287脆弱性が存在するバージョンのsudoを使用していることが確認できた。
【▲ システムで使用されているsudoバージョン確認】
(3) sudo -uオプションに因子値 -1(or 4294967295)を入力して例外を発生させ、/bin/bashを実行するとroot権限でshellが実行されたことが確認できる。root権限を獲得したAはシステム設定を任意に変更/削除、2次攻撃のためにマルウェアの挿入及び実行が可能になる。
【▲ root権限に特権エスカレーション成功】
今回紹介するCVE-2019-18634脆弱性も同じくApple Security TeamのJoe Vennixが発見して、sudoに pwfeedbackオプションが有効されている環境でsudoコマンドを入力時、パスワード入力プロンプトからバッファオーバーフローを発生さえて特権エスカレーションを起こす。
区分 | 脆弱なバージョン | 危険度 |
---|---|---|
CVE-2019-18634 | 1.71~1.8.25p1バージョンのsudoユーティリティを使用しているUnix/Linux | High (CVSS 7.8) |
【▲ CVE-2019-18634紹介】
sudoコマンドを使用する際にシステムはユーザーパスワード入力を要求する。sudoはユーザーがアクセスしたターミナル内からまずパスワードをs菓子、当該の値がターミナル内に存在しない場合、SUDO_ASKPASS変数に保存されているパスのプログラムを呼び出してユーザーがパスワードを入力するプロンプトを提供する。
【▲ sudo実行過程Flow Chart】
pwfeedbackオプションは呼び出されたプロンプトの視覚的な効果(***)をあげるオプションである。このオプションはDefaultに無効かされているが、管理者が便宜のために有効化した場合パスワード入力値にバッファオーバーフローが可能である。
【▲ pwfeddbackオプションが有効になったsudoersポリシー】
CVE-2019-18634脆弱性は様々な言語で作成された10数種類のPoCが存在する。その中、shellスクリプトで作成されたPoCを分析してみた。流れを見るとsocatを通じてシンボリックリンク(/tmp/ptv)を作成してslaveプロセス(sudo)と両方向通信を繋げた後、ペイロード(/tmp/ptv)を実行されてバッファオーバーフローを発生させる。その後プロセスディスクリプタの所有者及び権限を変えるプログラム(/tmp/pipe)を実行してsudoプロセスのディスクリプタをrootに変換してパスワード入力プロンプトをバイパスする。
【▲ PoC Exploit過程Flow Chart】
バッファオーバーフローを起こすペイロード(xpl.pl)はperl言語でプログラミングされていてこれを確認してみると数多いデータが出力されるようになっていてperlコマンドでこれを実行する場合バッファオーバーフローが発生する。
【▲ ペイロードソースコード(xpl.pl)】
プロンプトにバッファオーバーフローが発生したらその間にプロセスのディスクリプタを修正するソースコード(exec.c)が実行される。ここでsudoプロセスのディスクリプタの権限がrootに変更されパスワード入力をバイパスすることができる。
【▲ ファイルディスクリプタの変更ソースコード(exec.c)】
攻撃者Aはアカウントiglooでサーバのアクセスに成功した。しかしシステム管理者がsudoに対するセキュリティ対策でiglooのアカウントにsudoの権限を制限的に設定してAが獲得したiglooの権限はサーバに直接的な被害を与える方法は存在しない。そこでAは侵入したシステムのsudoユーティリティにpwfeedbackオプションが有効になっていることを確認した。AはCVE-2019-18634脆弱性を利用してパスワード入力値をバイパスしてrootにアクセスしようとしている。
区分 | 環境別バージョン |
---|---|
Server OS | Ubuntu 16.04.2 (192.168.0.75) |
sudo Version | 1.8.6p7 |
アクセスアカウント | igloo |
【▲ 攻撃試演環境】
(1) iglooのアカウントにアクセスした攻撃者Aはrootへの特権エスカレーションのためにシステムを確認している途中、sudoコマンドを入力するとパスワード入力値に「*」が表示され、当該のシステムにpwfeedbackオプションが有効になっていることを確認した。
【▲ pwfeedbackオプションの有効確認】
(2) sudo -Vコマンドを入力してしすてむがCVE-2019-18634脆弱性が存在しているバージョンを使用しており、perlコマンドを通じてパスワード入力値にバッファオーバーフローが発生することを確認した。
【▲ CVE-2019-18634脆弱性存在確認】
(3) 攻撃者がPoCコードをexploitするとwgetを通じてsocatコマンドをダウンロードしてsudoと仮想ターミナルの間に連結を試し、ペイロードを実行させ、バッファオーバーフローを発生させてroot権限獲得に成功する。s
【root権限への特権エスカレーション成功】
今回紹介した脆弱性は全てセキュリティパッチが配布されている。下記の表は各脆弱性が存在するsudoのバージョンとパッチのリリース日である。
CVE | 脆弱なバージョン | バッチ日 |
---|---|---|
CVE-2019-14287 | 1.8.27以下の全てのバージョン | 2019.10.10 |
CVE-2019-18634 | 1.71~1.8.30バージョン | 2020.01.29 |
【▲ sudoバージョン情報】
最新バージョンのsudoのインストール方法は下記になる。
(1) sudo -Vコマンドで現在システムにインストールされているsudoユーティリティのバージョンが確認できる。
【▲ sudo -V実行結果】
(2) パッケージ保存先(repository)のリストに欲しいバージョンのsudoが存在するか確認後、インストール
【▲ パッケージ保存先を利用したsudoアップデート】
CVE-2019-18634の場合sudoユーティリティにpwfeedbackオプションが有効になっていると発生する脆弱性であるためsudoers設定から当該のオプションを無効するだけで十分に予防できる。
【▲ pwfeedbackオプション無効化】
今回はsudoユーティリティの脆弱性の中で「CVE-2019-14287」と「CVE-2019-18634」について調べてみた。sudoユーティリティは管理者権限でプロセスをが実行できるため、悪用された時、システムに大きな被害を及ぼす。そのため、上記に紹介した対応方法を参考してバージョンが最新バージョンより低い場合、アップデートをするなど適切な対応を推奨する。
[1] MITRE ATT&CK MATRIX
https://attack.mitre.org/matrices/enterprise/linux/
[2] Sudo 유틸리티 관련 취약점 통계
https://cve.mitre.org/
[3] CVE-2019-14287 (Linux sudo vulnerability) analysis
https://programmer.ink/think/cve-2019-14287-linux-sudo-vulnerability-analysis.html
[4] sudo patch (1) – CVE-2019-14287
https://www.sudo.ws/repos/sudo/rev/83db8dba09e7
[5] socat 명령어 관련
http://www.dest-unreach.org/socat/doc/socat.html
[6] 유닉스/리눅스 계열 운영체제 Sudo 명령어 취약점 보안 업데이트 권고 (KrCert)
https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=35469
[7] sudo patch (2) – CVE-2019-18634
https://github.com/sudo-project/sudo/commit/fa8ffeb17523494f0e8bb49a25e53635f4509078
[8] Analysis of CVE-2019-18634
https://dylankatz.com/Analysis-of-CVE-2019-18634/
Written by CYBERFORTRESS, INC.
Tweet