
Boîte à outils de recherche qui obtient un accès root sur un téléviseur Samsung Tizen 9 via une RCE Chromium WasmGC et un accès arbitraire à la mémoire physique physmap V4L2, avec une charge utile persistante au démarrage et un canal de shell root.
Recherche de sécurité non officielle sur un Samsung Neo QLED de 2024 exécutant Tizen 9. Pas de sdb, pas de mode développeur, pas de flashage de firmware : la TV est rootée depuis son propre navigateur, et le root est rendu persistant via une application de service de démarrage d'origine.
| Unité de test | Neo QLED 2024, série QNX1D (plateforme QTV T09) |
| Firmware | T-PTMxxxx (01400) |
| Noyau | Linux 5.4.249, ARM32 (VMSPLIT_3G + HIGHMEM, sans LPAE), PAGE_OFFSET 0xC0000000, PHYS_OFFSET 0x20000000 |
| Navigateur | Chromium 120.0.6099.5 (SamsungBrowser/7.0) |
| Root | uid=0, CapEff=0x3fffffffff |
| Charge utile persistante | dépôt v41 (md5/taille actuels dans la ligne d'état de AGENTS.md — régénérés à partir de l'artefact) ; l'unité de test exécute la même build (déployée le 2026-10-27, les balises portent tok=) ; payload_backup.dll conserve la build précédente |
| Canal root | TCP 31337 sur la TV, protocole ligne par ligne, les réponses se terminent par __END__ |
pwsh -File .\root.ps1 -TvIp <tv-ip> # root the TV
pwsh -File .\uninstall.ps1 -TvIp <tv-ip> # restore stock
root.ps1 s'exécute sur le PC et pilote tout : il démarre le serveur sur le port 80, root le stub du navigateur, installe la charge utile de démarrage et attend le canal root après le redémarrage. Deux étapes restent sur la télécommande du téléviseur, et il les demande toutes les deux :
http://<pc-ip>/index.html affichée et attendre RUNNING ;Ensuite :
python tools\root_shell.py "id" <tv-ip> # talk to the TV's root channel
Chaque option, les invites exactes, la sortie attendue, la mise en garde sur l'IP de l'hôte et la
procédure de repli manuelle : docs/USAGE.md.
/dev/video40/30/60) acceptent un
vm_pgoff choisi par l'attaquant dans mmap() et le transmettent à remap_pfn_range()
sans validation : lecture/écriture arbitraire de la mémoire physique depuis un processus
non privilégié (uid 5001, groupe video).init_task en mémoire physique, retrouver notre
propre tâche via le real_parent d'un processus enfant forké, et remettre à zéro les identifiants.app_onboot d'origine par
une charge utile .NET qui répète le patch physmap/identifiants à chaque démarrage, ferme son
nœud et sert un canal de commandes root sur TCP 31337.Aucun CVE GPU, aucun exploit noyau, aucun module signé. Le physmap est la partie
intéressante ; l'analyse étape par étape avec les constantes mesurées se trouve dans
docs/EXPLOIT.md.
| Document | Contenu |
|---|---|
docs/USAGE.md | l'exécution : options, invites, sortie attendue, détails de désinstallation, récupération |
docs/EXPLOIT.md | la chaîne étape par étape, avec les constantes spécifiques au firmware |
docs/ROOT-METHODS.md | chaque méthode de root/persistance évaluée et celle qui l'a emporté |
docs/FAILED.md | ce qui n'a pas fonctionné et pourquoi — se lit comme une liste d'impasses, fait gagner des semaines |
docs/BOOT-REGRESSION-SMACK.md | le bug le plus subtil du projet : une étiquette SMACK erronée faisait mourir l'application avant Main |
docs/PORTABILITY.md | un autre téléviseur Tizen 9 : les quatre barrières, ce qu'il faut re-mesurer, un portage étape par étape |
docs/SERVER-HOSTING.md | le serveur côté PC : comment il doit s'exécuter, le piège de la mort silencieuse, le pare-feu, les journaux |
docs/SCRIPT-REVIEW.md | audit de préparation à la production des scripts |
docs/TESTING.md | les couches de test, hors ligne et sur le téléviseur, et ce que chacune détecte |
docs/LOGGUIDE.md | chaque balise et erreur d'outil décodée, avec les étapes suivantes |
docs/REFERENCE-MATERIALS.md | où télécharger le firmware / les sources GPL / les outils de simulation pour votre propre modèle |
docs/REVIEW-HISTORY.md | les constats de revue clôturés et leurs preuves (archive) |
docs/OPEN-ISSUES.md | l'état actuel, le travail en attente et l'historique des revues/passes clôturées |
AGENTS.md | passation : outils, procédure, vérification, pièges, récupération |
CHANGELOG.md | historique daté de ce qui a changé et pourquoi |
SECURITY.md | la porte dérobée 31337 non authentifiée, périmètre, signalement, aspects juridiques |
NOTICE.md | attribution des tiers ; quels fichiers ne sont pas re-licenciés |
LICENSE | MIT pour le travail original (fichiers tiers exclus) |
root.ps1, uninstall.ps1 PC entry points (PowerShell)
payload/ boot payload source (.NET 6, Program.cs)
server/ port-80 server, exploit page, TV-side deploy scripts
tools/ physmap client, kernel helpers, build scripts
docs/ the documents above
AGENTS.md hand-off notes
LICENSE, NOTICE.md license + third-party attribution
SECURITY.md backdoor/scope/reporting
L'ensemble du toolkit est versionné, donc un clone s'exécute sans aucun autre arbre de travail.
server/payload.dll est inclus volontairement (identique octet pour octet à la sortie de build)
afin que le toolkit fonctionne sans SDK .NET. Les journaux d'exécution, la sortie de build et le
script de déploiement généré par hôte sont ignorés par git et ne sont jamais servis via HTTP.