
Sri Lanka Institute of Information Technology
課題 1
M. P. D. M. Dias
IT19165530
MLB_WD_Y2S1_13.1
ポイントツーポイントプロトコルデーモンRCE
脆弱性(CVE-2020-8597)
システムおよびネットワークプログラミング– IE2012
目次
はじめに
ポイントツーポイントプロトコル(PPP)は、ダイヤルアップ接続からDSLブロードバンド、SSL暗号化を組み込んだ仮想プライベートネットワーク(VPN)に至るまで、レイヤ2またはデータリンクインフラストラクチャを通じて単純なデータをカプセル化して配布できる全二重プロトコルです。これらのプロトコルはポイントツーポイント通信を許可しないため、PPPは直接接続された2つのノード間でIPおよびTCPを実装するためにも使用されます。pppdは、Unix系オペレーティングシステムで使用されるデーモンであり、2つのノード間のPPPセッションの確立とセッションの終了を管理します。
PPPは、ダイヤルアップモデム、DSL接続、およびピアツーポイントトンネリングプロトコル(PPTP)などの仮想プライベートネットワーク(VPN)を介したその他のいくつかのポイントツーピア接続形式でインターネット接続を作成するために使用されるプロトコルです。pppdプログラムは、ネットワークに接続するピアを認証したり、EAPなどのさまざまな認証プロトコルを利用してピアに認証情報を提供したりすることもできます。
ポイントツーポイントプロトコルデーモン(pppd)による拡張認証プロトコル(EAP)パケットの処理に欠陥があるため、認証されていないリモート攻撃者がスタックバッファオーバーフローを引き起こし、ターゲットシステム上で任意のコードを実行できる可能性があります。この脆弱性は、メモリに提供されたデータをコピーする前に入力サイズを検証する際の誤りによって引き起こされます。データサイズの検証が誤っている場合、ランダムなデータがメモリにコピーされる可能性があり、ファイル漏えいを引き起こして意図しないコード実行につながる可能性があります。
この脆弱性は、EAP解析コードのロジック、具体的には、ネットワーク入力ハンドラが呼び出すeap.cのeap_request()関数とeap_response()関数にあります。これらの関数は、最初のバイトをタイプとして使用し、ポインタと長さを入力として受け取ります。形式がEAPT MD5CHAP(4)の場合、1バイト長の埋め込み領域を調べます。このコードの論理は、埋め込みの長さがパケットの全長よりも小さいことを確認することを目的としています。この検証の後、埋め込み長フィールドの後にローカルスタックバッファに配置されている提供データ(ホスト名)をコピーしようとします。この境界チェックは正しくなく、任意のデータ長でのメモリコピーを許可します。
さらに別の論理エラーにより、eap_input()関数は、リンク制御プロトコル(LCP)プロセス中にEAPが解決されたかどうかをテストしません。これにより、EAPをサポートしていないため、またはLCP段階で合意された事前共有パスフレーズに準拠していないためにpppが認証のネゴシエーションを拒否した場合でも、認証されていない攻撃者がEAPパケットを送信できます。eap_inputでは、安全でないpppdコードがEAPパケットを処理し続け、スタックバッファオーバーフローを引き起こします。この未検証でサイズ不明のデータは、標的デバイスのメモリを侵害するために使用される可能性があります。さらに、pppdは高い権限(システムまたはroot)で実行され、カーネルドライバと連携して動作します。
pppdプログラムは、LWIP(lightweight IP)プロジェクトと組み合わせて、小型コンピュータにpppd機能を提供するためにも使用されます。デフォルトのlwIPインストールおよびインストールは、このバッファオーバーロードの影響を受けません。ただし、lwIPソースコードを使用して、コンパイル時にEAPを許可するように明示的に変更した場合、プログラムはバッファオーバーフローの影響を受けやすくなります。
CVE-2020-8597は、拡張認証プロトコル(EAP)パケットプロセッサの概念的欠陥による、pppdのバッファオーバーフローバグです。脆弱なPPPクライアントまたはサーバに特別に細工されたEAPパケットを送信する不正なリモート攻撃者は、サービス拒否状態または任意のコード実行を引き起こす可能性があります。pppdはカーネルドライバと連携して動作し、デバイスやさらにはコアなどの高い権限も持つため、コード実行は同じ権限で実行される可能性があります。
脆弱性を発見した人物
IOActiveのセキュリティ研究者であるIlja Van Sprundel氏によって発見されたこの重大な問題は、pppdアプリケーションの拡張認証プロトコル(EAP)モジュールパーサー(PPP接続で追加の認証方法をサポートする拡張機能)の論理エラーによって発生するスタックバッファオーバーフローの欠陥です。
CVSSスコア9.8のCVE-2020-8597として追跡されているこの脆弱性は、不正な攻撃者によって悪用され、影響を受けるデバイス上でリモートから任意のコードを実行し、それらを完全に制御できる可能性があります。
発見方法
この脆弱性は、データをメモリに転送する前に入力サイズを検証する際の誤りに起因します。データサイズの検証が誤っているため、ランダムなデータがメモリにコピーされ、データベースの断片化を引き起こし、不正なコードの実行につながる可能性があります。
この脆弱性は、EAP解析コードのロジック、具体的には、ネットワーク入力ハンドラによって呼び出されるeap.cのeap_request()関数とeap_response()関数にあります。
EAPが許可されていない場合、またはリモートピアがパスワードやパスフレーズを使用してEAPを開始していない場合に、pppdが安全であると結論付けるのは誤りです。これは、認証された侵入者が常に未承諾のEAPパケットを送信してバッファオーバーフローを誘発できる可能性があるためです。
この脆弱性は、ポイントツーポイントプロトコル(PPP)デーモン、つまりpppdで特定されています。PPPは、ダイヤルアップモデム、DSL接続、モバイルネットワークを含む他の多くの物理ネットワークを介した接続を確立するために使用されるレイヤ2プロトコルです。PPPは、暗号化された接続を提供するために仮想プライベートネットワーク(VPN)で使用されるポイントツーポイントトンネリングプロトコル(PPTP)などの追加プロトコルを含むように組み込まれ、拡張されてきました。
この状況を通じて、SEI CERTコラボレーションチームは、この欠陥を発見したセキュリティアナリストのIlja Van Sprundel氏(IOActive)と、ソースコードを管理するソフトウェア開発者のPaul Mackerras氏(OZlabs)と提携し、問題を容易に調査して回避策を見つけました。この問題は、ブール式の基本的な欠陥と、その結果としての条件文の実装による、pppdソースコードのバッファオーバーフローに関するものでした。以下の文は、サイズ不明の入力を許可し、それをスタックバッファにコピーするように欺くことができます。これは一般に、フレームオーバーフローまたはスタックバッファオーバーフローと呼ばれます。
if (vallen >= len + sizeof(rhostname)) { // Copy to buffer rhostname
この脆弱性の修正は、上記の文を以下のブール論理に変更するだけでした。
if (len-vallen >= sizeof(rhostname)) { // Copy to buffer rhostname
Paul氏はこの欠陥に対してCVE-2020-8597を発行し、彼が管理するソースコードへの修正を続けました。このバグを修正するために必要なシステムアップデートは、数行のコードだけで済む小さなものです。それにもかかわらず、この安全でない技術は、数千のソフトウェアプロジェクトのライブラリに存在しています。これは、家庭用ルータからビジネス用ネットワークハードウェアに至るまでのネットワークアクセスデバイスを提供する100以上の企業で採用されています。この脆弱性はすべてのPPPクライアントとサーバに影響するため、インターネットサービスプロバイダ(ISP)にも影響します。
発見時期
2020年3月4日、CERT調整センター(CERT/CC)の研究者は、ポイントツーポイントプロトコルデーモン(pppd)バージョン2.4.2から2.4.8の重大な脆弱性に関する脆弱性ノート#782301を公開しました。この開示はIOActiveのIlja van Sprundel氏によるものとされています。
引き起こし得る被害
脆弱なPPPクライアントまたはサーバに未承諾のEAPパケットを送信することにより、不正なリモート侵入者がpppdプロセスのメモリ破損を引き起こし、任意のコード実行につながる可能性があります。
研究者によると、ポイントツーポイントプロトコルデーモンのバージョン2.4.2から2.4.8(過去17年間に公開されたすべてのバージョン)は、この新しいリモートコード実行バグの影響を受けます。
以下に挙げる一般的に使用されている主要なLinuxディストリビューションは、すでに影響を受けていると報告されており、他のいくつかのプロジェクトも影響を受けている可能性が高いです。
Debian Ubuntu SUSE Linux Fedora NetBSD Red Hat Enterprise Linux
さらに、pppdアプリケーションを同梱する他の影響を受けやすいアプリケーションやデバイス(一部は以下に記載)の数も膨大である可能性が高く、ハッカーに広範な攻撃対象領域を提供します。
Cisco CallManager TP-LINK製品 OpenWRT Embedded OS Synology製品
ポイントツーポイントプロトコルデーモン(pppd)の拡張認証プロトコル(EAP)パケット処理の欠陥により、認証されていないリモート攻撃者がスタックバッファオーバーフローを引き起こし、ターゲットシステム上で任意のコード実行を可能にする可能性があります。この脆弱性は、提供されたデータをメモリにコピーする前に入力サイズを検証する際のエラーによるものです。データサイズの検証が正しくないため、任意のデータがメモリにコピーされ、メモリ破損を引き起こし、不要なコードの実行につながる可能性があります。
悪用手法
この重大な問題は、pppdソフトウェアの拡張認証プロトコル(EAP)パケットパーサー(PPP接続で追加の認証方法をサポートする拡張機能)の論理エラーによって存在するスタックバッファオーバーフローの脆弱性です。
このためには、攻撃者は、直接シリアルリンク、ISDN、イーサネット、SSH、ソケットCAT、PPTP、GPRS、またはATMネットワークを介して、脆弱なPPPクライアントまたはサーバに、未承諾で不正な形式のEAPパケットを送信するだけで済みます。
さらに、pppdは多くの場合高い権限で実行され、カーネルドライバと連携して動作するため、この欠陥により、攻撃者はシステムまたはrootレベルの権限で悪意のあるコードを実行できる可能性があります。
選択した悪用方法
脆弱なクライアントを悪用するために、リモートコード実行方式を使用しました。リモートコード実行(RCE)とは、サイバー侵入者が、許可なく、またマシンの場所を知られることなく、誰かが管理するデバイスに侵入して変更を加える能力に関係します。RCEにより、攻撃者は任意のマルウェア(malware)ソフトウェアを実行することで、コンピュータまたはサーバを乗っ取ることができます。
私は同じコンピュータ上でテストするために2台の仮想マシンを使用しました。1台をサーバとして、もう1台をクライアントとして使用しました。仮想マシンを接続するためにSSHをインストールしました。それらのIPアドレスを使用して、Fedora 29仮想マシンをサーバ側として接続し、Kali Linux仮想マシンを脆弱なクライアント側として接続しました。
指示に従って、pppoe-serverをセットアップしました。次にデバッグモードを有効にしてログファイルを設定し、ログファイル'/etc/ppp/pppoe-server-options'に以下を追加しました。その後、'sudo pppoeconf'を入力してpppoe-clientをセットアップしました。最後に、Pythonコードを使用して脆弱なクライアントを悪用しました。また、脆弱なPPPクライアントに未承諾のEAPパケットを送信することで、リモート攻撃者がpppdプロセスのメモリ破損を引き起こし、任意のコード実行を可能にする可能性があります。
悪用のスクリーンショット
脆弱なクライアントとのPing
サーバへのSSHのインストール
クライアント側でrootアクセスを取得
クライアントのrootアクセス取得後
クライアント側でSSHを有効化
クラッシュ
結果
結論
GitHub Security Labによる救済
Vijay Sarvepalli氏はGitHubの最新のセキュリティイニシアチブを調査する中で、GitHubのAPIとCodeQLソリューションを活用してこの問題に対処する機会を特定したいと考え、コードを使用してソフトウェアリポジトリのユーザーに修正を提案しました。彼は、当団体の政府セキュリティリーダーであるAllan Friedman氏(米国商務省内の国立電気通信情報局(NTIA)のサイバーセキュリティイニシアチブディレクター)に連絡を取りました。同氏は、ソフトウェア部品表(SBOM)を作成するために、GitHubを含むさまざまな組織をまとめています。
Allan氏はVijay Sarvepalli氏を、セキュリティに専念するGitHubの担当者に紹介し、彼らは私をGitHub Security Labの責任者であるNico Waisman氏に引き合わせてくれました。
Nico氏とGitHub Security Labの国際的なチームは、彼らのセキュリティパッチ適用メカニズムをこの問題に適応させる方法をすぐに見つけました。彼らは、このバグの影響を受けるすべてのリポジトリの所有者に連絡する自動「ロボット」技術を起動しました。リポジトリの所有者は、バグを修正するために、コピーまたはフォークしたpppdプログラムのバージョンを修正して保護するためのいくつかの簡単な措置を講じるだけで済みました。
このコミュニティの取り組みにより、技術が修正される段階に到達しました。これは、保護を強化するためにソースコードへの改善を実装するための、モジュール式でタイムリーなアプローチを提供しました。GitHub Security Labの自動更新から4日以内に、1,896人のリポジトリ所有者がバグの詳細を提供され、数回のクリックで修正するオプションが与えられました。これらのリポジトリ所有者のうち少なくとも42人が自動パッチを承認しました。さらに13人が、問題がすでに修正されていることを確認しました。自動化がなければ、影響を受けるリポジトリの所有者に連絡してアプリを修正するには数日かかるでしょう。
DoDの課題とソフトウェアの未来におけるCERTの役割
連邦政府資金による研究開発センター(FFRDC)として、カーネギーメロン大学のソフトウェア工学研究所(SEI)とそのCERT部門は、米国国防総省(DoD)がサイバー空間で直面する課題に常に直面しています。DoDのCIOであるTerry Halvorsen氏は、著名なサイバーセキュリティの擁護者であり、AFCEAカンファレンスでの講演で「サイバー防御行動と対抗行動はミリ秒単位で発生するでしょう」と述べました。これらの望ましいサイバー防御行動は、手動または面倒なコミュニケーションプロセスでは実行できません。それらは、現在の人間参加型(ヒューマン・イン・ザ・ループ)パッチ適用モデルの問題を制限するために、ソフトウェアを介して提供され、可能な限り自動化されなければなりません。
潜在的な脅威管理活動を通じて、情報セキュリティの脆弱性に対するソースコードのパッチ適用を加速するために、(GitHub Security Labとのこのパートナーシップなどの)インセンティブを活用できる状況を特定できると期待しています。これは情報保護の問題をすべて解決するものではなく、優れたコーディング手法の代わりにはならないことを理解していますが、バグは情報が公開された後に発見される傾向があることも認識しています。情報が私たちの日常生活に浸透している場合、情報は脆弱性の迅速な特定によってのみ保護できます。そして、可能であれば、特定と対応の両方を自動化することによってのみ保護できます。
参考文献
• https://www.kb.cert.org/vuls/id/782301/ • https://thehackernews.com/2020/03/ppp-daemon-vulnerability.html • https://www.tenable.com/blog/cve-2020-8597-buffer-overflow-vulnerability-in-point-to-point-protocol-daemon-pppd • https://insights.sei.cmu.edu/cert/2020/03/security-automation-should-begin-at-the-source.html • https://packetstormsecurity.com/files/156802/pppd-2.4.8-Buffer-Overflow.html • https://www.drizgroup.com/driz_group_blog/what-is-remote-code-execution-attack-how-to-prevent-this-type-of-cyberattack • https://github.com/WinMin/CVE-2020-8597 • http://www.howtodoityourself.org/pppoe-server-how-to-do-it-yourself.html