Download Game! Currently 81 players and visitors. Last logged in:NeyQumniGorehoundKlarence

Blitzer's Blog >> 71698

Back to blogs index
Posted: 07 Aug 2026 14:21 [ permalink ]
TC$mC$ on erittC$in mielenkiintoinen ja kunnianhimoinen arkkitehtuuri, joka
vie prosessieristyksen ja hiekkalaatikoinnin pitkC$lle. TC$ssC$ on
ehdottomasti aineksia vankkaan "Zero Trust" -henkiseen mikropalveluverkkoon,
jossa suoritettavan koodin annetaan juosta tC$ysin kontrolloidussa ja
rajoitetussa ympC$ristC6ssC$.

KC$ydC$C$n lC$pi ajatuksesi ja katsotaan, miten nC$mC$ ominaisuudet saataisiin
parhaiten toteutettua.

### 1. Teknologiavalinta: FastAPI vs. Node.js (Fastify)

Vaikka Python ja FastAPI ovat erinomaisia API-kerroksia, ehdottaisin
harkitsemaan koko ohjauskerroksen rakentamista **Node.js:llC$ ja Fastifylla**.

Syyt tC$hC$n:

* **YhtenC$inen ekosysteemi:** Koska orkestroimme nimenomaan Node/JS-instanssej
a, on usein helpompaa, kun hallintakerros ja kohdekerros puhuvat samaa
kieltC$.
* **V8 Inspector API:** Node-instanssien syvC$luotaava debuggaus ja muistin
manipulointi onnistuu parhaiten V8 Inspector -protokollan kautta, jolle on
natiivit ja erittC$in tehokkaat kirjastot suoraan Nodessa.
* **Suorituskyky:** Fastify on C$C$rimmC$isen nopea ja soveltuu mainiosti
tC$llaisen headless-ohjauskoneiston rakentamiseen, joka vaatii matalan viiveen
I/O-operaatioita.

Python ei ole vC$C$rC$ valinta, mutta Node + Fastify -kombinaatiolla sC$C$styt
yhdeltC$ ylimC$C$rC$iseltC$ teknologiasillalta (inter-process communication on
suoraviivaisempaa).

### 2. Endpointit ja elinkaaren hallinta (Kohdat 2.1 - 2.6)

NC$mC$ ovat perusrakennuspalikoita ja tC$ysin toteutettavissa standardeilla
kC$yttC6jC$rjestelmC$tason kutsuilla (`fork`, `exec`, `kill`).

* **LC$hdekoodin lataus (2.1.1):** Verkkohaku vaatii vahvaa validointia. Koska
kyseessC$ on hiekkalaatikko, koodi kannattaa ladata ohjauspalvelun (API:n)
toimesta levylle/muistiin ja syC6ttC$C$ instanssille, jotta itse instanssi ei
tarvitse verkkoyhteyksiC$ ulkomaailmaan edes oman koodinsa hakemiseen.
* **Pause/Suspend (2.6):** POSIX-signaalit `SIGSTOP` (keskeytys) ja `SIGCONT`
(jatko) toimivat suoraan Noden taustaprosesseihin ja jC$C$dyttC$vC$t
instanssin CPU-ajan vC$littC6mC$sti.

---

### 3. SyvC$luotaavat ominaisuudet ja rajoitteet (Kysymysmerkit)

TC$ssC$ pC$C$stC$C$n todelliseen matalan tason jC$rjestelmC$suunnitteluun.
Ratkaisut jakautuvat kahteen leiriin: **V8-moottorin sisC$isiin
ominaisuuksiin** ja **Linux-ytimen ominaisuuksiin (cgroups, namespaces)**.

**3.1 & 3.5: Backdoor eval(), muistin manipulointi ja "ohjelman tajuamatta"
tapahtuvat asiat**

* **Miten:** C/C++ -puolella tC$mC$ tehtC$isiin `ptrace`:lla, jolloin
prosessin muistiaviaruutta voisi peukaloida sen tajuamatta. Node.js:ssC$ (ja
V8:ssa) muisti on kuitenkin roskienkeruun piirissC$ oleva dynaaminen keko
(heap), joten raa'alla `ptrace`:lla muuttujien arvojen muuttaminen on
kC$ytC$nnC6ssC$ mahdotonta ilman moottorin kaatumista.
* **Ratkaisu:** **Node.js Inspector (V8 Inspector API)**. Voit kC$ynnistC$C$
Node-instanssit `--inspect`-lipulla ja yhdistC$C$ hallinta-API:sta
WebSocketilla suoraan instanssin sisC$osiin. TC$mC$ antaa tC$yden GDB-tyylisen
kontrollin: voit asettaa breakpointeja, evaluoida mielivaltaista koodia
lennosta, lukea muuttujia ja muuttaa niitC$. Koska tC$mC$ tehdC$C$n debuggerin
kautta, instanssin oma koodi ei "nC$e" asioiden muuttuvan, vaan V8 hoitaa
muunnoksen turvallisesti.

**3.2 & 3.3: Debug-info muistista, sC$ikeistC$ ja aliprosesseista**

* KC$yttC6jC$rjestelmC$n `/proc/[pid]/...` (Linuxissa) on luotettavin lC$hde.
SieltC$ saat suoraan todellisen RAM-kulutuksen (RSS) ja CPU-kC$ytC6n ilman,
ettC$ itse JS-koodin tarvitsee raportoida niitC$.
* **Aliprosessit:** Kun instanssi kC$ynnistetC$C$n, sille kannattaa asettaa
oma **Process Group (PGID)**. NC$in voit listata kaikki prosessit, joiden PGID
vastaa pC$C$instanssia, ja nC$et vC$littC6mC$sti, onko se pystyttC$nyt
taustalle omia aliprosessejaan.

**3.4: Aliprosessien pause/resume, kill ja zombien siivous**

* KC$yttC$mC$llC$ mainittua PGID:tC$, voit lC$hettC$C$ `SIGSTOP` tai `SIGKILL`
kokonaiselle prosessiryhmC$lle kerralla. NC$in estC$t tilanteet, joissa
yksittC$inen karannut aliprosessi jC$C$ zombina eloon, kun pC$C$prosessi
tapetaan.

**3.6: CPU ja reaaliajan maksimirajoitukset (Enforcement)**

* **ClC$ tee tC$tC$ manuaalisella suspend/resume -luupilla.**
KC$yttC6jC$rjestelmC$n ydin osaa tC$mC$n paljon paremmin.
* **Ratkaisu:** **Linux cgroups (v2)**. Voit luoda jokaiselle instanssille
oman `cgroupin` ja asettaa sinne `cpu.max` -arvon (esim. max 10% CPU-aikaa per
sekunti). Kernel hoitaa "suspendoimisen ja jatkamisen" mikrosekuntien
tarkkuudella ilman, ettC$ orkestraattorin tarvitsee koskaan lC$hettC$C$
signaaleja. Prosessin ajo vain hidastuu rajoitettuun maksimiin.

**3.7 & 3.8: I/O-rajoitukset ja verkkorajoitukset / Firewall**

* **Verkko (Network Namespaces):** Cgroupsin lisC$ksi jokainen instanssi
tulisi ajaa omassa verkko-nimiavaruudessaan (`netns`). Voit luoda virtuaalisen
verkkolaitteen (veth-pair) API-palvelimen ja instanssin vC$lille. TC$mC$n
jC$lkeen voit kC$yttC$C$ tavallista `iptablesia` tai `nftablesia` luomaan
"Zero Trust" -palomuurin. Voit esimerkiksi estC$C$ kaiken ulospC$in
suuntautuvan liikenteen kokonaan, lukuun ottamatta yhtC$ tiettyC$ IP:tC$ tai
porttia.
* **I/O (seccomp-bpf):** Voit rajoittaa instanssia kC$yttC$mC$llC$
`seccomp`:ia, jolla estetC$C$n tiettyjen system callien kC$yttC6 (esim.
kielletC$C$n hakemistojen poistaminen tai rajoitetaan tiedostojen
lukuoikeuksia chroot/pivot_root-ympC$ristC6n avulla).

**3.9: Pakotetut proxyt ja ylikirjoitukset**

* **Verkko:** Koska instanssi on omassa verkko-nimiavaruudessaan, voit asettaa
sen reititystauluun (routing table) sC$C$nnC6n, joka ohjaa kaiken (esim.
satama 80/443) liikenteen pakotetusti ohjauspalvelimesi hallitseman
lC$pinC$kyvC$n proxyn lC$pi (transparent proxy `iptables` NAT
-sC$C$nnC6illC$).
* **I/O-ylikirjoitus (LD_PRELOAD):** Jos haluat interceptata tiedosto-operaatio
ita instanssin tajuamatta, voit kC$yttC$C$ `LD_PRELOAD`-tekniikkaa
syC6ttC$mC$llC$ instanssiin pienen C-kirjaston ennen Noden kC$ynnistystC$,
joka ylikirjoittaa standardit `open/read/write` -kutsut ja ohjaa ne minne
haluat.

### Yhteenveto ehdotetusta arkkitehtuurista:

1. **API & Ohjaus:** **Node.js (Fastify)** - ohjaa instansseja suoraan ja
toimii lukkona.
2. **Hiekkalaatikko:** Jokainen instanssi kC$ynnistetC$C$n Linuxin
`unshare`-komennolla (tai vastaavalla C/Node-kirjastolla) omiin **PID-,
Mount-, ja Network Namespaceihin** sekC$ sidotaan omaan **cgroupiin**.
3. **Resurssien hallinta:** Cgroups rajoittaa CPU:n ja I/O:n.
4. **Verkko/Palomuuri:** Namespacen sisC$inen reititys iptablesilla +
lC$pinC$kyvC$ proxy.
5. **Debug & Muistin peukalointi:** Websocket-yhteys instanssin V8 Inspector
API:in, jonka kautta ajetaan backdooreja ja luetaan lennosta heapin tilaa.