
CVE-2017-12945 のエクスプロイト。
Mersive Technologies Inc. が設計したワイヤレスコラボレーション&プレゼンテーションプラットフォームである Mersive Solstice Pods のうち、2.8.4 より前のファームウェアバージョンを実行しているデバイスには、(リモート)(認証済み)(ブラインド) OS コマンドインジェクションの脆弱性が存在します。これはベンダーのウェブサイトでも認められ、報告されています (下のスクリーンショットを参照)。その結果、認証された攻撃者は、巧妙に細工した HTTP リクエストを送信することで、脆弱性のある Mersive Solstice Pods 上で (root 権限による) 任意のコマンドを実行できます。

この脆弱性は、サーバーサイドでの入力値/パラメータの検証が欠如しているために発生します。ユーザーが制御する一部の入力値/パラメータは、root ユーザーのコンテキストで OS コマンドを実行するように設計された public static String runShellCommand(String command) メソッドの引数として直接渡されます。この安全でない構成により、攻撃者は脆弱性のあるデバイスを完全に侵害できる可能性があります。
Mitre CVE リファレンス:
ベンダー変更ログ:
2.8.4 より前のバージョンのファームウェアを実行している Mersive Solstice Pods。
com/mersive/solstice/server/EthernetInterface.java:static void SetPrefixLength(int prefixLength) {
int value = -1 << (32 - prefixLength);
try {
Log.d("Ethernet", "complete: " + ServerDisplay.runShellCommand("ifconfig eth0 netmask " + InetAddress.getByAddress(new byte[]{(byte) (value >>> 24), (byte) ((value >> 16) & 255), (byte) ((value >> 8) & 255), (byte) (value & 255)}).getHostAddress()));
} catch (Exception e) {
e.printStackTrace();
}
}
static void SetGateway(String gateway) {
if (!gateway.equals(GetGateway())) {
Log.d("Ethernet", "complete: " + ServerDisplay.runShellCommand("ip route del default"));
Log.d("Ethernet", "complete: " + ServerDisplay.runShellCommand("ip route add default via " + gateway + " dev " + ETH0));
}
}
static void SetStaticIP(String ipAddr) {
Log.d("Ethernet", "complete: " + ServerDisplay.runShellCommand("ifconfig eth0 " + ipAddr));
}
com/mersive/solstice/server/ServerDisplay.java:public static String runShellCommand(String command) {
return runShellCommand(command, true);
}
public static String runShellCommand(String command, boolean wait) {
Log.d("Shell Command", command);
try {
Process process = Runtime.getRuntime().exec("shell-tunnel --client");
DataOutputStream stdin = new DataOutputStream(process.getOutputStream());
InputStream is = process.getInputStream();
stdin.writeBytes(command + "\n");
stdin.flush();
stdin.writeBytes("exit\n");
stdin.flush();
if (wait) {
process.waitFor();
}
byte[] buffer = new byte[1024];
Arrays.fill(buffer, 0);
return new String(buffer, 0, is.read(buffer));
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
この脆弱性を悪用するには、認証された攻撃者は、脆弱性のあるバージョン (2.8.4 より前) のファームウェアを実行しているデバイスに対して、特別に細工したリクエストを送信する必要があります。このリクエストは、デバイスの Web インターフェース (set static IP address フォーム) から直接送信することもできますし、cURL などのコマンドラインユーティリティを使用して送信することもできます。
どちらの場合でも、ペイロードの前には、元の/正規のコマンドの完了後にペイロードを実行させるため、/bin/sh に連続したコマンドを実行するよう指示する特殊文字 (例: ; または & 文字) を付ける必要があります。
複数の脆弱なパラメータのうちの 1 つである staticIP パラメータは、gateway パラメータと同様、サーバーサイドでは検証されず、代わりに static void SetStaticIP(String ipAddr) メソッドの引数として直接渡されます。このメソッドはさらにそれを public static String runShellCommand(String command) メソッドの引数として渡します。
この構成により、認証された攻撃者は、脆弱性のあるデバイス上で root ユーザーのコンテキストで任意のコマンドを実行することが可能になります。
Copyright (C) 2019 Alexandre Teyar
Apache License、Version 2.0(以下「本ライセンス」)に基づいてライセンスされます。 本ライセンスに従わない限り、このファイルを使用することはできません。 本ライセンスのコピーは、次から入手できます。
http://www.apache.org/licenses/LICENSE-2.0
適用法によって要求される場合、または書面によって同意された場合を除き、本ライセンスに基づいて配布されるソフトウェアは、明示的または黙示的を問わず、いかなる保証も条件もなしに「現状のまま」で配布されます。 本ライセンスに基づく特定の許可および制限については、本ライセンスを参照してください。