Gitのクライアント側とサーバー側の重大な脆弱性により、リモートでコードが実行されます





情報セキュリティ研究者のLaëlCellierは、Gitのクライアント側とサーバー側に2つの重大な脆弱性(CVE-2016-2324およびCVE ‑ 2016-2323)を発見しました。



これらを使用して、攻撃者はリモートでコードを実行できます。 これを行うには、非常に長い名前を持つファイルのツリーでリポジトリを作成し、リモートの脆弱なサーバーに「プッシュ」を送信するか、脆弱なクライアントが「プル」できるようにします。



問題を引き起こす2つのエラーは、path_name()という関数に含まれています。この関数は、リポジトリツリーのパスの末尾にファイル名を追加するために使用されます。 攻撃者はパスとファイル名を使用して悪意のあるコードを実行できます。攻撃を成功させるには、ASLRなどのさまざまな保護ツールを克服する必要がありますが 、これ行うことができます。



以下は、2.7.0より前のGitバージョンのrevision.cコードです。



char *path_name(const struct name_path *path, const char *name) { const struct name_path *p; char *n, *m; int nlen = strlen(name); int len = nlen + 1; for (p = path; p; p = p->up) { if (p->elem_len) len += p->elem_len + 1; } n = xmalloc(len); m = n + len - (nlen + 1); strcpy(m, name); for (p = path; p; p = p->up) { if (p->elem_len) { m -= p->elem_len + 1; memcpy(m, p->elem, p->elem_len); m[p->elem_len] = '/'; } } return n; }
      
      





コード内のエラーは、整数オーバーフローとバッファオーバーフローの可能性をもたらします。



さらに、Positive Technologiesの研究者は運用上のエクスプロイトを作成できました。 脆弱性CVE-2016-1285は、RNDCコントロールパッケージのフィールドタイプの不十分なチェックにあります。 特別に細工されたパッケージは、モジュールsexpr.cまたはalist.cでアサーションエラーを引き起こす可能性があります。 攻撃を行うには、認証されていない攻撃者が、namedが制御パケット(named.confファイルの制御セクション)を受信できるネットワークにいる必要があります。



TCPトランスポートによって送信されるパケットには、表形式のフィールド値構造があります。この構造では、さまざまなフィールドがバイナリデータ、ネストされたテーブルまたはリストになります。



これは、lib / isccc / cc.cの認証を担当するコードは次のようになります。



  _auth = isccc_alist_lookup(alist, "_auth"); if (_auth == NULL) return (ISC_R_FAILURE); if (algorithm == ISCCC_ALG_HMACMD5) hmac = isccc_alist_lookup(_auth, "hmd5"); else hmac = isccc_alist_lookup(_auth, "hsha"); if (hmac == NULL) return (ISC_R_FAILURE);
      
      





画像



脆弱性をカバーするパッチの本質は、isccc_alist_lookup関数の結果をさらに確認することです。



たとえば、 このリンクの diff:



  _auth = isccc_alist_lookup(alist, "_auth"); - if (_auth == NULL) + if (!isccc_alist_alistp(_auth)) return (ISC_R_FAILURE);
      
      







isccc_alist_alistp関数は、ネストされたフィールドの追加検証を実行します。

isccc_alist_alistp(isccc_sexpr_t * alist)



 { isccc_sexpr_t *car; if (alist == NULL || alist->type != ISCCC_SEXPRTYPE_DOTTEDPAIR) return (ISC_FALSE); car = CAR(alist); if (car == NULL || car->type != ISCCC_SEXPRTYPE_STRING) return (ISC_FALSE); if (strcmp(car->value.as_string, ALIST_TAG) != 0) return (ISC_FALSE); return (ISC_TRUE); }
      
      





問題は数年間気付かれませんでした-ブランチ1.9および1.7を含むGitの2.7.0の脆弱なバージョン。 両方の脆弱性は2016年2月にリリースされたバージョン2.7.1で修正されましたが、Gitの開発者はエラーの解消を発表していないため、多くのユーザーと管理者はまだシステムを更新していません。



Zellierは、発見した脆弱性に関する情報をGitHubに送信し、サービスのバグ報奨金プログラムの一環として5000ポイントを受け取りました 。非常に深刻な脆弱性を検出すると同様の報酬が与えられます。



その後、GitHubの従業員エラーを修正し、 Git 2.7.1の新しいバージョンを公開しました。これは企業ユーザーに提供されましたが、これに関する個別の発表はありませんでした。 また、GitLabはGit 2.7.3のサポートでソフトウェアを更新しました。これには修正およびその他のバグが含まれています。



Positive Technologiesの専門家は、Gitサーバーのすべてのユーザーと管理者が使用するソフトウェアのバージョンを更新することを推奨しています。 こちらから新しいバージョンをダウンロードできます。



All Articles