This generates a small Linux filesystem. In default config needs UPX, linux headers, Rust toolchain and GCC toolchain. Resulting fs is a statically linked.
MiniLinuxFS generuje Linuxovou adresářovou strukturu podle designu distribuce stali skupiny suckless.org. Všechny binární soubory jsou staticky linkované.
- GCC toolchain
- Rust toolchain (doporučována nejnovější nightly verze)
- UPX
- linux, asm, asm-generic headery ve složce /usr/include (pouze při kompilaci programů z 9base)
- git
- curl
- make
- ed
- bash
- základní unixové programy (cp, rm, ln, sed, grep...)
Minilinuxfs lze konfigurovat pomocí souboru cfg.toml v kořenovém adresáři repozitáře. Program používá TOML pro konfiguraci.
- Cestu k adresáři s kostrou adresářové struktury a konfiguračnímy soubory lze změnit pomocí hodnoty input
- Cestu výstupního adresáře lze změnit pomocí hodnoty output
- Cestu k adresáři kde dochází ke stažení repozitářů a kompilaci programů lze změnit pomocí hodnoty git
Zbytek konfiguračního souboru jsou záznamy pro jednotlivé repozitáře s programy. Každý záznam musí začínat řádkem obsahujícím text "[[entries]]". Následují parametry ve volitelném pořadí:
Název | Popis | Povinný |
---|---|---|
url | Adresa gitového repozitáře | Ano |
name | Jméno, ovlivňuje pouze název složky uložení* | Ano |
cmds | Příkazy ke spuštění kompilaci | Může být prázdný |
paths | Pole dvojic cest: zdroj a cíl** | Může být prázdný |
install | Příkazy ke spuštení po kompilaci | Ne |
* = Může být absolutní cesta
** = zdroj je relativní ke kořenu daného repozitáře, cíl je relativní ke kořenu
výsledné adresářové struktury
Pozn 1: U pole install lze v příkazech využít hodnotu '<<target>>', která reprezentuje absolutní cestu k výslednému adresáři.
Pozn 2: Příkazy jak u cmds tak u install nejsou plnohodnotné shellové příkazy. Začátek musí vždy být název platného spustitelného souboru, následovaný parametry pro daný příkaz oddělenými libovolnými bílými znaky.
V základní konfiguraci stáhne MiniLinuxFS 6 repozitářů: sbase, ubase, 9base, bash-static, find-static a coreutils-static. Z nich využívá jen některé programy:
sbase* | ubase | 9base | coreutils |
---|---|---|---|
|
|
|
|
|
|
|
a spousta dalších lol |
|
|
|
nechce se mi psát |
|
|
|
dokumentace fujNU coreutils: |
|
|
|
https://www.gnu.org/software/coreutils/manual/coreutils.html |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
A bash z bash-static. U 9base je potřeba další programy přidat i v Makefile-u. Bash a programy z sbase a ubase jsou komprimovány pomocí UPX. Velikost bashe je také snížená pomocí programu strip.
Všechny programy jsou staticky linkované a používají musl libc.
MiniLinuxFS v základní konfiguraci využívá adresářovou strukturu sta.li:
/ - the root home
/bin - all executables
/sbin -> /bin # softlink pointing to /bin
/boot - all boot files
/etc - system configuration
/home - user directories
/var - spool, run, log, cache
/share - man pages, locales, dependencies
/include - include/headers
/lib - static libraries for building stuff
/mnt - mount points
/usr -> / # softlink pointing to /
/dev - devices
/proc - proc files
/sys - sys files
Normální průběh je vyvolán příkazem 'make'.
- Po spuštění příkazu cargo postaví program install
- Make zkopíruje install do kořenového adresáře repozitáře
- install se pokousí přečíst a parsovat konfigurační soubor. V případě neúspěchu, program se ukončí s kódem -1, když se nepodaří soubor přečíst a -2 když se jej nepodaří parsovat.
- install postupně zklonuje všechny repozitáře, při chybě se ukončí s kódem -3
- install postupně spouští všechny příkazy pro kompilaci programů, pokud některý z programů vrátí nenulovou hodnotu, ukončí se s kódem -4
- install zkopíruje všechny soubory specifikované v poli paths jednotlivých záznamů, pokud nelze soubor zkopírovat, program panikaří
- install spustí všechny příkazy v poli install
Pozn 1: V případě chyby v kopírování, změně/přečtení CWD nebo neúspěchu spustit příkaz kód panikaří
Pozn 2: Kopírování vstupní souborové struktury používá 'cp -a' místo funkce kvůli zachování symbolických odkazů.
Pozn 3: Při znovu-sestavení install maže a znovu-klonuje původní repozitáře. Neměly by tedy proto obsahovat žádné lokální změny mimo soubory vytvořené kompilací
Pozn 4: Výsledky mazání souborů jsou zahozeny
Resetovací průběh je zpuštěn příkazem 'make clean'
- install je spuštěn s parametrem 'clean'
- Pokusí se přečíst a parsovat konfigurační soubor
- V případě neúspěchu se vypne, jinak smaže výstupní složku a složku se staženými repozitáři programů.
- Make (resp. rm) smaže složku s artifakty programu install a program samotný
Pozn: Make ignoruje chybu pokud byl ./install již dříve smazán
Program byl otestován na distribuci Arch s triplety x86_64-unkown-linux-gnu a armv7l-unkown-linux-gnueabihf
V základní konfiguraci produkuje MiniLinuxFS relativně bezpečné prostředí:
- Všechny programy jsou staticky linkované -> není nutnost připojit složky /lib a /lib64 hostitelského systému
- K normálnímu běhu základních programů není nutné připojit ani /proc, ani /dev
- Základní programy neobsahují nic co by mohlo zobrazit procesy hostitelského systému (ps, pstree, top), změnit uživatele (su, sudo) nebo ovlivnit stav stroje (halt, shutdown, reboot)
- Nepřítomnost překladačů (např pro C/C++ nebo Perl) zamezuje využítí exploitů
- Neobsahuje programy které by vyžadovaly /sys
Chroot jail tedy může být kompletně izolovaný od okolního systému a útect z něj je velmi obtížné, ne-li nemožné, bez ohledu na to, jestli je uživatel root.