Skip to content

Latest commit

 

History

History
260 lines (222 loc) · 20.2 KB

README.md

File metadata and controls

260 lines (222 loc) · 20.2 KB

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é.

Obsah

  1. Požadavky
  2. Konfigurace
  3. Programy
  4. Adresářová struktura
  5. Průběh
  6. Bezpečnost

Požadavky

  • 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...)

Konfigurace

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.

Programy

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
  • basename
  • chvt
  • ascii
  • cp
  • cal
  • clear
  • awk
a spousta dalších lol
  • cat
  • ctrlaltdel
  • basename
nechce se mi psát
  • chgrp
  • dd
  • bc
dokumentace fujNU coreutils:
  • chmod
  • df
  • cal
https://www.gnu.org/software/coreutils/manual/coreutils.html
  • chown
  • dmesg
  • cat
  • chroot
  • eject
  • cleanname
  • cksum
  • fallocate
  • cmp
  • cmp
  • free
  • date
  • cols
  • freeramdisk
  • dc
  • comm
  • fsfreeze
  • dd
  • cp
  • getty
  • diff
  • cron
  • halt
  • du
  • cut
  • hwclock
  • echo
  • date
  • id
  • ed
  • dirname
  • insmod
  • factor
  • du
  • killall
  • fmt
  • echo
  • last
  • fortune
  • ed
  • lastlog
  • freq
  • env
  • login
  • getflags
  • expand
  • lsmod
  • grep
  • expr
  • lsusb
  • hoc
  • false
  • mesg
  • join
  • find
  • mknod
  • listen1
  • mkswap
  • look
  • flock
  • mount
  • ls
  • fold
  • mountpoint
  • md5sum
  • getconf
  • nologin
  • mk
  • grep
  • pagesize
  • mkdir
  • head
  • passwd
  • mtime
  • hostname
  • pidof
  • pbd
  • join
  • pivot_root
  • kill
  • ps
  • primes
  • link
  • pwdx
  • rc
  • ln
  • readahead
  • read
  • logger
  • respawn
  • rm
  • logname
  • rmmod
  • sam
  • ls
  • stat
  • sed
  • md5sum
  • su
  • seq
  • mkdir
  • swaplabel
  • sha1sum
  • mkfifo
  • swapoff
  • sleep
  • mktemp
  • swapon
  • sort
  • mv
  • switch_root
  • split
  • nice
  • sysctl
  • ssam
  • nl
  • truncate
  • strings
  • nohup
  • umount
  • tail
  • od
  • unshare
  • tee
  • paste
  • uptime
  • test
  • pathchk
  • vtallow
  • touch
  • printenv
  • watch
  • tr
  • printf
  • who
  • troff
  • pwd
  • unicode
  • readlink
  • uniq
  • renice
  • unutf
  • rev
  • urlencode
  • rm
  • wc
  • rmdir
  • yacc
  • sed
  • seq
  • setsid
  • sha1sum
  • sha224sum
  • sha256sum
  • sha384sum
  • sha512
-224sum
  • sha512
-256sum
  • sha512sum
  • sleep
  • sort
  • split
  • sponge
  • strings
  • sync
  • tar
  • tail
  • tee
  • test
  • tftp
  • time
  • touch
  • tr
  • true
  • tsort
  • tty
  • uname
  • unexpand
  • uniq
  • unlink
  • uudecode
  • uuencode
  • wc
  • which
  • whoami
  • xargs
  • xinstall
  • yes

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.

Adresářová struktura

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

Průběh

Normální průběh je vyvolán příkazem 'make'.

  1. Po spuštění příkazu cargo postaví program install
  2. Make zkopíruje install do kořenového adresáře repozitáře
  3. 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.
  4. install postupně zklonuje všechny repozitáře, při chybě se ukončí s kódem -3
  5. 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
  6. install zkopíruje všechny soubory specifikované v poli paths jednotlivých záznamů, pokud nelze soubor zkopírovat, program panikaří
  7. 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'

  1. install je spuštěn s parametrem 'clean'
  2. Pokusí se přečíst a parsovat konfigurační soubor
  3. 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ů.
  4. 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

Bezpečnost

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.