TVŮJ SOFTWARE NIKOHO NEZAJÍMÁ!
Pokud bude můj software spravovat nějaké peníze, cryptoměnu nebo něco jinak hodnotného, tak bude zajímat každého. Tohle je snad největší chyba, kterou člověk může ve svých úvahách udělat!
Hodně právě uvažuji nad tím, jak ochránit dedikovaný počítač proti leaknutím důležitých informací vedoucí k neoprávněnému získání spravovaných hodnot.
Jaké jsou tam rizika?
- Klasické napadení z venku (vlámat se dovnitř skrze známou chybu a plně jej ovládnout)
- Ovládnutí z venku (přesvědčit stroj, aby mne poslouchal)
- Ukrást ho fyzicky
- Ukrást některou HW součást (HW klíč, disk)
- Přinutit provozovatele telehausu, aby udělal kopii stroje + dump paměti
- Riziko že si ho vykrade sám majitel nebo společník
Zatímco první bod jsem schopen řešit třeba tak, že stroj nebude jednat jako server, tedy bude se chovat jako klientský počítač, nebude mít otevřený žádný port například, Druhý bod už je těžší, protože znamená to, že útočník musí získat kontrolu na počítačem, který tenhle stroj poslouchá a věří mu (master). Zabezpečení HTTPS např. nebo vzájemná autentifikace stran, vyhnout se DNS a podobně může pomoci tím, že útočník nebude moci dotazy stroje přesměrovat a vydávat se tak za mastera
No a teď jsem se dostal k bodům, kdy se řeší, že informace uložené na serveru leaknou jinou cestou. Když už se útočník dostane do stroje, tak z něho pouze vytáhne údaje, klíče, hesla, a teď jde o to, aby mu to i přesto bylo k ničemu. Pokud ho ukradne fyzicky (tedy ho bude muset například odpojit) nebo mu ukradne disk, tak je zde možnost snížit riziko ukradení tím, že některá část hesla bude uložena v paměti, zadaná při startu systému a odpojením se ta informace smaže. Pokud ale získá i DUMP paměti, je to víceméně v háji.
Decryptace lze řešit C++ kódem, což je jen o píď lepší, než to když to bude napsané v pythonu nebo v PHP. Záleží, co útočník získá. Například se do stroje vláme jako user s omezenými právy, tak pravděpodobně nezíská binárku (bude spouštěná pod rootem a následně se jí ponízí práva). Skriptovací jazyky zpravidla vyžadují, aby kód byl dostupný pod uživatelem, ve kterém je proces spuštěný (takže je útočník může získat)
Zpět k tématu, nebudu uvažovat plné ovládnutí stroje a získání všech klíčů, včetně zadaných (část klíče může být zasílána z mastera při každém požadavku, takže samotný dump stroje i s paměti nemusí dostačující, bude vyžadovat aby se stroj spojil se svým masterem). Když už útočník získal všechny klíče ale vše má zašifrované, chybí mu jedna část, kterou nezískal, může si jí dopočítat. Proto mi připadá rozumné, aby zde byl i nějaký časový faktor, klidně hodně přehnaný, klidně vytažen i na jednotky sekund, aby útočník nemohl klíče, které nezískal rychle dopočítat.
Jinak ještě k posledním bodům. Předposlední body lze asi řešit diverzifikací... tedy nedržet vše na jednom místě a tím vytvořit single point of failure. Riziko majitele a společníka bude potřeba asi řešit na straně práva.
Cold wallet samozřejmě uvažuju také, pokud jde o cryptoměnu.