
استغلال لـ CVE-2017-12945.
توجد ثغرة أمان من نوع حقن أوامر نظام التشغيل (عن بُعد) (مُوثَّقة) (عمياء) في أجهزة Mersive Solstice Pods - وهي منصة تعاون وعرض لاسلكية صممتها شركة Mersive Technologies Inc. - التي تعمل بإصدارات من البرامج الثابتة أقدم من 2.8.4، كما تم الإقرار بها/الإبلاغ عنها على موقع البائع، انظر لقطة الشاشة أدناه. ونتيجة لذلك، يمكن للمهاجم المُوثَّق تشغيل أوامر عشوائية (بامتيازات الجذر) على أجهزة Mersive Solstice Pods الضعيفة عن طريق إرسال طلبات HTTP مصممة خصيصًا لها.

توجد هذه الثغرة بسبب عدم التحقق من صحة المدخلات/المعلمات من جانب الخادم. يتم تمرير بعض المدخلات/المعلمات التي يتحكم بها المستخدم مباشرةً كوسائط إلى طريقة public static String runShellCommand(String command) المصممة لتنفيذ أوامر نظام التشغيل ضمن سياق المستخدم الجذر. قد يسمح هذا التكوين غير الآمن للمهاجم باختراق الأجهزة الضعيفة بالكامل.
مرجع Mitre CVE:
سجل تغييرات البائع:
أجهزة Mersive Solstice Pods التي تعمل بإصدارات من البرامج الثابتة أقدم من 2.8.4.
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). يمكن إرسال هذا الطلب إما مباشرةً من واجهة الويب للجهاز (من نموذج "تعيين عنوان IP ثابت") نفسه، أو بدلاً من ذلك، يمكن إرساله باستخدام أداة سطر أوامر مثل cURL.
في كلتا الحالتين، يجب أن يسبق الحمولة حرف خاص يوجه /bin/sh لتشغيل أوامر متتالية، مثل الحرف ; أو &، حتى يتم تنفيذ الحمولة بعد اكتمال الأمر الأصلي/الشرعي.
المعامل staticIP وهو أحد المعاملات الضعيفة المتعددة إلى جانب المعامل gateway لا يتم التحقق من صحته من جانب الخادم ويتم تمريره مباشرةً كوسيطة إلى طريقة static void SetStaticIP(String ipAddr) التي بدورها تمرره كوسيطة إلى طريقة public static String runShellCommand(String command).
يسمح هذا التكوين للمهاجم المُوثَّق بتشغيل أوامر عشوائية على الأجهزة الضعيفة ضمن سياق المستخدم الجذر.
Copyright (C) 2019 Alexandre Teyar
مرخص بموجب ترخيص Apache، الإصدار 2.0 (الترخيص)؛ لا يجوز لك استخدام هذا الملف إلا بما يتوافق مع الترخيص. يمكنك الحصول على نسخة من الترخيص على
http://www.apache.org/licenses/LICENSE-2.0
ما لم يقتض القانون المعمول به أو يتم الاتفاق عليه كتابيًا، يتم توزيع البرنامج بموجب الترخيص على أساس "كما هو"، دون أي ضمانات أو شروط من أي نوع، سواء كانت صريحة أو ضمنية. راجع الترخيص للحصول على الأذونات والقيود المحددة التي تحكم استخدامك للبرنامج.