docs(domains F+J): v2 после adversarial-ревью (37 находок) + кросс-док
F (plugin-host, 17): - exec-путь плагина (/data/apps/<id>/, код exec-поддерево / данные noexec); IPC-передача Install→App-Host (LoadApp/UnloadApp); teardown с явным StopApp+отзыв грантов; атомарный install/update (staging+rename, a-base §3); ре-валидация манифеста на каждом activate + capability-pin; sideload-гигиена распаковки; бюджет ресурсов (cgroup+OOM); аудит операций; namespace manifest-id ru.shturman.* vs OWN-экспорт ru.shturman.plugin.<id>.*; WASM↔identity-конфликт; PluginManager в ipc; dev-tools/тест-харнесс (#13); фазы (SDK/dev v0, экосистема v3) J (cameras, 20): - Stage 0 ранний путь = DRM/KMS из initramfs (не Wayland) + DRM-master handoff smithay без чёрного кадра; реверс-сигнал owner=Power/GPIO (CAN-gear требует сигнал в E); camera_in capability + per-node видео-гейтинг (/dev/videoN only first-party); fail-safe frame-watchdog → no_signal (не stale DMABUF); dashcam privacy (152-ФЗ, fscrypt, retention, factory-reset, индикатор); lifecycle (не пишет в sleep, ShutdownImminent-флаш сегментами, grace-hold via B); surround/video ресурсы (VPU/DMABUF/a-base §8); dev-симулятор камер (#13); Camera в ipc Кросс-док: ipc (AppHost.LoadApp/UnloadApp, PluginManager, Camera), security-privacy (namespace-фикс ru.shturman.*, camera_in, audit-scope), a-base §3 (dashcam в at-rest fscrypt) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+16
-3
@@ -73,9 +73,16 @@
|
||||
- Статическая фильтрация — прокси + sandbox (§5, владеет App-Host); broker — политика и рантайм-согласия.
|
||||
|
||||
### `ru.shturman.AppHost` — запуск/супервизия апов и плагинов
|
||||
- **Методы:** `ListApps() → [(id, status)]`, `StartApp(id)`, `StopApp(id)`, `GetStatus(id) → status`.
|
||||
- **Сигналы:** `AppStarted(id)`, `AppStopped(id)`, `AppCrashed(id, reason)`.
|
||||
- (Установка/дистрибуция плагинов — домен F, не здесь.)
|
||||
- **Методы:** `ListApps() → [(id, status)]`, **`LoadApp(id)`** (читает манифест `/data/apps/<id>/`,
|
||||
конфигурит sandbox+прокси+`sender→манифест`; затем доступен `StartApp`), `StartApp(id)`, `StopApp(id)`,
|
||||
**`UnloadApp(id)`** (снести sandbox/прокси/identity-binding), `GetStatus(id) → status`.
|
||||
- **Сигналы:** `AppStarted(id)`, `AppStopped(id)`, `AppCrashed(id, reason)`, `AppLoaded(id)`.
|
||||
- Установка/жизненный цикл плагинов — `ru.shturman.PluginManager` (ниже, домен F): зовёт `LoadApp`/`UnloadApp` после install/remove/update.
|
||||
|
||||
### `ru.shturman.PluginManager` — установка/жизненный цикл плагинов (домен F)
|
||||
- **Методы:** `InstallPlugin(pkg)`, `RemovePlugin(id)`, `UpdatePlugin(id)`, `ListPlugins() → [(id, version, status)]`.
|
||||
- **Сигналы:** `PluginInstalled(id)`, `PluginRemoved(id)`, `PluginUpdated(id)` (+ эмит нормативных audit-записей, A §9).
|
||||
- **Привилегированная операция** — недоступна самим плагинам через прокси. Контракт детально — домен F.
|
||||
|
||||
### `ru.shturman.Connectivity` — сеть (обёртка NM/MM)
|
||||
- **Методы:** `GetStatus() → status`, `ListNetworks() → [...]`, `Connect(id)`, `Disconnect()`.
|
||||
@@ -104,6 +111,12 @@
|
||||
### `ru.shturman.Media` / `…Nav` / `…Phone`
|
||||
- Свои интерфейсы (play/pause/route; navigateTo/cancel; dial/answer/hangup). **Детали — в спеках доменов** H/I/G; здесь — только факт регистрации на шине.
|
||||
|
||||
### `ru.shturman.Camera` — камеры/виды (владелец — домен J)
|
||||
- **Методы:** `ListSources()`, `SelectView(id)`.
|
||||
- **Сигналы:** `ReverseEngaged(on)` (источник — `Power`/GPIO, см. J §3).
|
||||
- **Properties:** `SignalState` per-source (`live`/`no_signal`/`acquiring`).
|
||||
- Видео — НЕ здесь (PipeWire/V4L2, data-plane); гейтится `camera_in` (security-privacy). До домена J — мок-стаб. Детали — [domains/j-cameras-video.md](../domains/j-cameras-video.md).
|
||||
|
||||
---
|
||||
|
||||
## 5. Брокеринг доступа песочных апов (портал-паттерн)
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
| `audio_in` (микрофон) | запись с микрофона — **высокочувствительно** | **per-node** capture-разрешение, выдаётся в момент **runtime-гранта** (не голый сокет!); **видимый индикатор**; сторонним — ограниченно. Нужен PipeWire с Security Context (~0.3.65+) |
|
||||
| `network` | доступ в сеть | net-namespace + **runtime-грант**. ⚠️ Строго — только бинарно on/off; **host-allowlist** требует forced-proxy/egress-firewall по SNI/Host (DNS-allowlist обходится прямым IP), иначе best-effort (§7) |
|
||||
| `location` | GPS/положение | D-Bus `ru.shturman.Location` (ipc §3) + **runtime-грант** |
|
||||
| `camera_in:[sources]` (камера) | захват видео с источников — **высокочувствительно** | **per-node** PipeWire Security Context + WirePlumber (video-ноды, default-deny), **runtime-грант + видимый индикатор**; `/dev/videoN` — только first-party; стороннему — узкий per-source грант |
|
||||
| `gpu` (render) | GPU-ускорение (UI/ML) | bubblewrap пропускает `/dev/dri` |
|
||||
| `storage` | приватное хранилище | bubblewrap **mount** `/data/apps/<id>/` |
|
||||
|
||||
@@ -105,8 +106,9 @@ PipeWire-capture/location). Для `audio_in`/`location` — **while-in-use**:
|
||||
в v0–v3 якорь = trust-by-build / физический контроль (dev-ключи, eFuse не жжём).
|
||||
- **Сторонние** — в `/data`, **всегда** в песочнице; install-ревью + runtime-промпты.
|
||||
**Целостность id при установке:** App-Host/Perm-Broker **отвергает** плагин, чей `id`
|
||||
совпадает с уже установленным или встроенным/first-party; namespace `ru.shturman.plugin.*`
|
||||
зарезервирован за образом. ⚠️ Без подписи (§6) это ловит только случайные коллизии, НЕ
|
||||
совпадает с уже установленным или встроенным/first-party; manifest-id namespace **`ru.shturman.*` (весь tree)** зарезервирован за first-party/образом —
|
||||
сторонний id = свой reverse-DNS (`dev.example.*`). *(D-Bus OWN-экспорт плагина — отдельный
|
||||
платформенный префикс `ru.shturman.plugin.<id>.*` (§4), это не manifest-id, не путать.)* ⚠️ Без подписи (§6) это ловит только случайные коллизии, НЕ
|
||||
намеренную подмену ещё-не-установленного легитимного id — аргумент за подпись **раньше** «маховика».
|
||||
|
||||
## 6. Доверие и дистрибуция (целостность манифеста)
|
||||
@@ -191,5 +193,6 @@ forced-proxy, §3); строгая гарантия — только бинар
|
||||
| Enforce-split | статически — прокси+sandbox (App-Host); рантайм-гранты — Perm-Broker; грант while-in-use, авто-снятие | 2026-06-16 |
|
||||
| Аудио | per-node гейтинг (PipeWire Security Context + WirePlumber), не голый сокет; capture по гранту | 2026-06-16 |
|
||||
| Сеть | строго — бинарно on/off; host-allowlist best-effort без forced-proxy | 2026-06-16 |
|
||||
| Целостность id | install-time отказ при коллизии id; `ru.shturman.plugin.*` зарезервирован | 2026-06-16 |
|
||||
| Целостность id | install-time отказ при коллизии id; manifest-id `ru.shturman.*` зарезервирован за first-party (OWN-экспорт `ru.shturman.plugin.<id>.*` — отдельный платформенный префикс) | 2026-06-16 |
|
||||
| `camera_in` | per-node гейтинг видео (PipeWire Security Context, как audio_in); `/dev/videoN` — only first-party | 2026-06-16 |
|
||||
| Audit-log | нормативный, владелец — домен A (§9, fscrypt-поддерево); просмотр — UI домена C | 2026-06-16 |
|
||||
|
||||
Reference in New Issue
Block a user