CVE-2026-71268
KrytyczneCVSS 9.9Streszczenie
Funkcja compile_program() w OpenPLC Runtime v3 nie waliduje ścieżek w dyrektywach (*FILE:...*) w plikach Structured Text, co pozwala na zapis dowolnych plików poza katalogiem ./core. Brak wywołania istniejącej funkcji validate_file_path() umożliwia zdalne wykonanie kodu, np. przez cron lub klucze SSH. Dodatkowo domyślne poświadczenia openplc:openplc ułatwiają eksploatację.
Ocena ryzyka
Atakujący może uzyskać pełną kontrolę nad systemem, wykonując dowolne polecenia z uprawnieniami usługi. Może to prowadzić do przejęcia systemu, kradzieży danych lub trwałego uszkodzenia.
Rekomendacja
Zaktualizuj OpenPLC do wersji z poprawką lub zastosuj obejście, np. wywołaj validate_file_path() w compile_program(). Zmień domyślne hasła i ogranicz dostęp do panelu.
Oryginalny opis (angielski, źródło NVD)
OpenPLC Runtime v3's compile_program() function (webserver/openplc.py) parses `(*FILE:path content*)` directives from uploaded Structured Text (.st) program files and writes the referenced content to `os.path.join('./core', file_path)` with no validation that file_path stays within the ./core directory. A crafted .st file containing a directive such as `(*FILE:../../../etc/cron.d/x * * * * root <command>*)` writes attacker-controlled content to an arbitrary filesystem path, enabling remote code execution (e.g. via cron or SSH authorized_keys). A path-validation function, validate_file_path(), exists elsewhere in the codebase (webserver/credentials.py) but is never invoked from compile_program(), leaving the sink unprotected. OpenPLC additionally ships with hardcoded default credentials (openplc:openplc), lowering the practical bar for exploitation.

