Portál AbcLinuxu, 3. května 2025 17:30
Na stránkách společnosti Zimperium (Wikipedie) byly zveřejněny informace o vážném bezpečnostním problému (CVE-2015-{1538,1539,3824,3826,3827,3828,3829}) nalezeném v knihovně Stagefright v Androidu. Problém se týká 95 % zařízení s Androidem. Detaily budou zveřejněny na bezpečnostních konferencích Black Hat USA a DEF CON 23 příští týden.
Tiskni
Sdílej:
a kdo dela s mobilem takove opicarny? a proc?Protože by chtěl mobil používat mimo jiné jako GPS s logováním, na čtení citlivých šifrovaných mailů a Jabberu, pro šifrované telefonování přes SRTP/ZRTP, pro focení věcí do kterých nikomu nic není, na nouzové zásahy na serverech a jako terminál pro různé interní systémy. A k tomu je kupodivu potřeba ho zabezpečit. A i kdyby nic z toho nedělal, pořád kompromitovaný telefon znamená trackování polohy a nahrávání okolních rozhovorů vzdálenou aktivací mikrofonu, což podle databáze uniklé z HackingTeamu dělá třeba česká policie. Na mobilu možná fakt nic citlivého nemáš, ale neříká se ani nic takového v jeho blízkosti? Nebo sis udělal hardwarový odpojovač mikrofonu? (asi těžko, když se bojíš i rootnutí)
... GPS s logováním ...Co tím přesně myslíš?
To je featura, kterou chceš? Proč?Už se mi párkrát hodilo vědět kde jsem kdy byl (momentálně to dělám zaznamenáváním wifi sítí). Nebo jako proč chci aby když mě někdo vyhackuje on věděl kde jsem? No to právě nechci! :)
Chápal bych, že ty chceš mít přehled, kdes byl, ale to už ty telefony dneska umí a Goolge, alespoň v tomhle případě, ty údaje poskytuje.Jako že bych svoji polohu ohlašoval Googlu? To zní opravdu lákavě.
Už se mi párkrát hodilo vědět kde jsem kdy byl (momentálně to dělám zaznamenáváním wifi sítí). Nebo jako proč chci aby když mě někdo vyhackuje on věděl kde jsem? No to právě nechci! :)Takle už to chápu :)
Jako že bych svoji polohu ohlašoval Googlu? To zní opravdu lákavě.Jestli máš telefon s Androidem, tak už se to dost možná děje... I když u tebe bych očekával, žes s touhle fíčurou zatočil :)
Jestli máš telefon s Androidem, tak už se to dost možná děje...Moc ho nenosím, protože šmíruje, je v něm backdoor a vzdáleně snadno zneužitelná chyba kterou už výrobce neopraví (tato zprávička). Byla to opravdu „výhodná“ koupě. Za levno prodám Samsung Galaxy Chat, rootnutý.
Since media processing is often time-sensitive, the library is implemented in native code (C++) that is more prone to memory corruption than memory-safe languages like Java. (Experts Found a Unicorn in the Heart of Android)Kéž by jazyky C, C++ a podobné zmizely.
Ovladače/jednočipy se budou psát pak v...asm?Hledal bych jazyky, které unsafe konstrukce dovedou uzavřít pouze ve vymezených částech kódu (například Rust, ATS nebo C#).
Co si představujete pod pojmem "uzavřít"?Uzavřít ho třeba do bloku
unsafe {}
. To samozřejmě nezaručí paměťovou bezpečnost, ale aspoň víte, kde nebezpečný kód hledat.
Navíc knihovny jako Stagefright by takový kód vůbec neobsahovaly – vyhradil bych jej například pro ovladače.
ale stále nevidím přínosPřínos je, že toho nebezpečného kódu máte málo a máte ho jasně oddělený. Tyto nebezpečné části kódu pak můžete důkladněji testovat, revidovat nebo formálně verifikovat. V C nebo C++ je potenciálně každá funkce nebezpečná, tudíž tam musíte věnovat zvýšenou pozornost celému kódu, což v praxi nejde, neboť by to bylo příliš nákladné. Navíc je v C a C++ řada konstrukcí, které nemají ani definované chování, což snižuje efektivitu revizí kódu.
jak píšete, ani unsafe { } neoddělí proces od nebezpečné části, takže pokud dojde k problému třeba i v knihovně (předpokládám, že správa paměti přidělí volané fuknci z knihovny stejný paměťový prostor jako má proces) složí se pravděpodobně celý proces.
Proto je lepší některé úlohy vyčlenit do samostatných procesů, které můžou běžet pod jiným uživatelem, v kontejneru nebo třeba i na jiném stroji. Např. kódování videa, sazba PDF nebo třeba indexace dokumentů můžou běžet v jiném procesu, než správa uživatelů. Stejně tak jdou oddělit veřejné části systému od těch, které jsou určené pro zaměstnance nebo vybrané uživatele.
Kéž by jazyky C, C++ a podobné zmizely.To by za ně nejprve musela existovat plnohodnotná náhrada. A to nemluvím o přepsání starého kódu.
Proč by vůbec někdo měl chtít programovat v C#.Zeptejte se spousty programátorů na C# fórech, čí zaměstnavatelů, proč jsou tak hloupí.
Proč by vůbec někdo měl chtít programovat v C#.Na rozdíl od Javy máte hodnotové typy a reifikovaná generika, což se hodí při psaní kódu náročného na výkon.
Moc si nedovedu představit jak napsat v C# drivery hardwaru nebo bootloader.Co přesně je podle vás problém? AFAIK uvnitř unsafe bloků můžete v C# psát prakticky stejný kód jako v C (což není dobrý nápad) až na zmíněný inline assembler – ten musíte napsat mimo a vytvořit mixed assembly.
zatímco v C/C++ jen speciality, kde se C#/Java nehodíCo je na nich tak speciálního, že musí být v C/C++? Proč nestačí v C/C++ napsat třeba jen několik malých funkcí, proč to musí být celé v C/C++?
Ano, uvnitř unsafe bloků. Jenže u bootloaderu není žádné "uvnitř". Typický bootloader je kus kódu, který se spouští jako úplně první věc (nebo druhá - po loaderu v boot-ROM). Při svém startu nemá inicializovaný základní hardware. Kód běží z flashe nebo malé interní RAM (typicky jednotky/desítky KB). Nemá k dispozici nic - žádné volání operačního systému, scheduler, alokaci paměti. Běžné knihovní funkce jako printf() jsou osekané nebo vůbec nejsou. Není zde místo ani pro obyčejný malloc(), natož pro garbage collector. Například můj první bootloader byl pro EP9135, musel se vejít do 2KB SRAM, inicializovat SDRAM a stáhnout přes sériový port second-stage bootloader (u-boot). Inicializace HW byla komplet assembleru. Stažení dat přes UART se vešlo naspané v C, z čehož jsem měl velikou radost. Drivery jsou jiná kapitola - paměti je sice dost, ale zase musíte brát ohled na ostatní věci běžící v OS. V obsluze přerušení smíte použít jen to, co si driver zabral už předtím. Nemůžete alokovat další paměť - protože kód správy paměti není reenterantní a možná jste právě jeho běh přerušili. Nemůžete použít zámky - protože zámek drží proces, který jste přerušili a pustí ho, až vy skončíte a on bude moci pokračovat. Vše co děláte, musíte udělat rychle - protože síťový adaptér už má plný buffer a tahá za interruptový signál ke svému driveru.Moc si nedovedu představit jak napsat v C# drivery hardwaru nebo bootloader.Co přesně je podle vás problém? AFAIK uvnitř unsafe bloků můžete v C# psát prakticky stejný kód jako v C (což není dobrý nápad) až na zmíněný inline assembler – ten musíte napsat mimo a vytvořit mixed assembly.
Ale stačí a stále častěji se to tak i dělá. Akorát ty "malé funkce" v některých případech hodně narostou - typicky právě u těch kodeků.zatímco v C/C++ jen speciality, kde se C#/Java nehodíCo je na nich tak speciálního, že musí být v C/C++? Proč nestačí v C/C++ napsat třeba jen několik malých funkcí, proč to musí být celé v C/C++?
ve kterém mohou být (a jsou) chyby, které pak umožní stejné zneužití jako ten kód v CAno. Nicméně ve vysokoúrovňových jazycích, kde se běhové prostředí distribuuje odděleně od programů, stačí opravit ono běhové prostředí a chyba zmizí ze všech programů. Zatímco u programů v C a C++ musíte opravit jednotlivé programy, neboť chyby jsou přímo v nich. Navíc běhové prostředí bývá mnohem více testováno, než běžné programy.
na druhou stranu zase můžeš říct, že jedna chyba v interpretu a máš chybu ve všech programechAno. Nicméně, jak už jsem psal výše, ten interpretr je jeden program, takže ho lze důkladně zkontrolovat, otestovat a případně i formálně verifikovat. Zatímco, abyste chyby přístupu do paměti eliminoval v C a C++ programech, musíte provést kontrolu každého programu, což se většinou nezaplatí. Krom toho chyby bývají i v kompilátorech C a C++. A jelikož se jedná o poměrně složité a ne zrovna dobře navržené jazyky, není jednoduché tyto chyby v kompilátorech eliminovat (pro C se o to snaží například CompCert).
vysokoúrovňové jazyky zpravidla mají nějaký interpreter, ve kterém mohou být (a jsou) chybyJediná taková chyba na kterou si vzpomínám bylo nějaké divné spouštění věcí v Perlu, tak mě zajímalo, jestli máš příklady i na nějaké jiné populární interpretry.
Nevim, jestli je to přesně cpython (a hledat se mi to nechce), ale co třeba tohle? https://www.debian.org/security/2002/dsa-159Tohle třeba nic. Vždyť je to z roku 2002 (13 let zpět) a navíc to nebyla zrovna dvakrát kritická chyba. Python je právě krásná ukázka toho co Jenda popisuje, protože těch bugů je tam málo a spousta z nich jsou prkotiny.
Nevim, jestli je to přesně cpython (a hledat se mi to nechce), ale co třeba tohle? https://www.debian.org/security/2002/dsa-159Zapomněl jsem dodat že mi jde typicky o remote exploity :)
Kolik lidí to používáŘádově miliony, možná desítky milionů? 100k je jen odběratelů /r/python (tj programátorů, co sleduje konkrétní subreddit).
Jako by všechno co má jen managed práci s pamětí bylo okamžitě zcela bezpečné.Nic takového jsem neřekl.
V high-level jazycích se bezpečnostní díry dělají úplně stejně dobře, akorát jsou jiného druhu.Tyto chyby jiného druhu nejsou v C a C++?
O C++ se nebudu vyjadřovat, protože v něm nepíšu, ale C je velmi kompaktní a jednoduchý jazyk a je zcela v silách průměrného programátora ho celkem rychle pochopit a ovládnout celý.Jo, proto se v něm opakují stále ty samé bezpečnostní bugy (koukám na tebe, buffer overflow) už asi 30 let.
Kdežto vysokoúrovnové jazyky mají často tuny (mis)featur a vyžadují roky studia, aby člověk pořádně zvládl jejich vzájemnou interakci.Jako bys v C nakonec nedělal úplně to samé, jen často vlastní (ne-úplně kvalitní) implementací. Kdybych měl počítat kolikrát jsem v C viděl implementovaný lineární spojový seznam, nebo asociativní pole, asi bych se nedopočítal. Výhoda C v korporátní sféře teda je, že na tom můžeš zabít pár dní, takže vypadáš že něco děláš, i když nic neděláš.
Vlastně bych řekl, že vysokoúrovňové jsou lepší i proti SQL injection a podobným vysokoúrovňovým chybám, protože kód je stručnější a programátor si spíše všimne, že ve funkci např chybí escapování.Programátor by v první řadě neměl slepovat textový SQL dotaz s parametry uvnitř, proboha!
V případě SQL by se mělo používat ORM
To jakože vždycky? :o
(ORM mám celkem rád a často ho považuji za dobrou volbu, ale dovedu si představit dobře a bezpečně napsanou aplikaci i bez něj – a někdy je to lepší bez ORM)
(ORM mám celkem rád a často ho považuji za dobrou volbu, ale dovedu si představit dobře a bezpečně napsanou aplikaci i bez něj – a někdy je to lepší bez ORM)Neříkám že to nejde, jen prostě proč. Jen se tím zvyšuje náchylnost k chybám a kód je pak zmixovanost dvou jazyků, přičemž oba fungují úplně jinak a ten druhý skládám stringama (podívej mami, já umím jezdit na kole bez držení - kdo si myslí, že je to dobrý nápad, ať se přihlásí). Nehledě na to, že se tam pak pořád objevují stejné vzory sáhnu_do_databáze-zkontroluji_hodnoty-něco_udělám, místo aby tam byla jen ta část něco_udělám a zbytek se přesunul do ORM.
Neříkám, že to tak jde vždy, ale člověku to usnadní dost sraní.
Ono zase když máš pak v těch datech něco hledat, tak dost usnadní práci, když máš model rozumně navržený a jakž takž normalizovaný. Pokud začínáš objektovým modelem a ten databázový ti zázračně vyčaruje nějaké ORM, tak to dost často nemusí vyjít.
Neříkám že to nejde, jen prostě proč. Jen se tím zvyšuje náchylnost k chybám … a ten druhý skládám stringama (podívej mami, já umím jezdit na kole bez držení - kdo si myslí, že je to dobrý nápad, ať se přihlásí).
O nebezpečí „SQL injection“ se ví už hodně dlouho a bylo o tom napsáno nespočet varovných článků, takže jestli to někdo dosud nepochopil a nedokázal se s tím vyrovnat, tak bude mít patrně i jiné a mnohem vážnější problémy.
kód je pak zmixovanost dvou jazyků
To by samo o sobě nevadilo – spíš naopak: je dobré používat jazyk navržený pro daný účel. Problém je spíš v nedostatečné propojenosti – kompilátor Javy mi nezkontroluje SQL vložené v kódu jako řetězec (stejně jako regulární výrazy, XPath dotazy a další výrazy) a taky tu dochází k nežádoucí duplikaci informací (názvy sloupečů a tabulek vs. názvy tříd a metod/atributů). Ale i tohle je řešitelné, např. pomocí JOOQ nebo různých query builderů. Já např. píšu SQL do zvláštních souborů, ne přímo do kódu (v Javě nebo podobném jazyce).
Navíc to není nic oproti dynamickým jazykům, kde si nemůžeš být jistý vůbec ničím a musíš si na všechno napsat testy.
Bylo by fajn, kdyby tyhle výrazy (SQL, regulární výrazy, XPath, různé EL atd.) šlo automatizovaně validovat (zrovna u toho SQL by to šlo velice dobře, stačí ho rozparsovat a zkontrolovat, zda dává smysl vzhledem k danému datovému modelu). Líbilo by se mi mít pro podporu v Jazyce a v IDE.
Nehledě na to, že se tam pak pořád objevují stejné vzory sáhnu_do_databáze-zkontroluji_hodnoty-něco_udělám, místo aby tam byla jen ta část něco_udělám a zbytek se přesunul do ORM.
Můžeš poradit nějaké prostředí, kde je přechod mezi daty uloženými persistentně (na disku) nebo v nějakém externím zdroji (typicky síť) a daty načtenými v aktuální paměti úplně bezešvý? Taky je potřeba řešit víceuživatelský a vícevláknový přístup. Bylo by to hezké, ale přijde mi to jako utopie, že všichni odevšad budou s daty pracovat, jako by to byla proměnná v jejich paměti.1 Takže nakonec stejně musíš pro data nějak někam sáhnout, pak s nimi něco děláš, a pak je zase persistentně někam uložíš – ať už s ORM nebo bez něj.
Neříkám že to nejde, jen prostě proč.
Taky je to trochu otázka perspektivy – jestli je pro tebe databáze nějaké nedůležité odkladiště dat a nutné zlo, zatímco primární je aplikace – nebo jestli naopak databáze je něco primárního a trvalého, zatímco aplikace je pomíjivá (můžeš ji třeba po roce zahodit a napsat novou, nebo jich provozovat víc najednou, kdežto databáze je pořád stejná, resp. vyvíjí evolučně).
[1] asi nejblíž k tomu mají právě uložené procedury v SQL databázi
O nebezpečí „SQL injection“ se ví už hodně dlouho a bylo o tom napsáno nespočet varovných článků, takže jestli to někdo dosud nepochopil a nedokázal se s tím vyrovnat, tak bude mít patrně i jiné a mnohem vážnější problémy.Jo, přesto se čas od času vyskytne i u hodně velkých společností, kde by člověk čekal profesionální programátory.
Můžeš poradit nějaké prostředí, kde je přechod mezi daty uloženými persistentně (na disku) nebo v nějakém externím zdroji (typicky síť) a daty načtenými v aktuální paměti úplně bezešvý?Poslední dobou si hraju s pythonní ZODB, resp. ZEO clusterem. Pak taky se smalltalkem, kde by přesně tohle měl dělat gemstone, ale zatím jsem se k němu ještě nedostal. Se ZEO to je bezešvé, ale dá chvíli zabrat to rozchodit tak jak to má být (například nepoužívat vlastní datové struktury (slovníky typicky), ale jen ty ze ZODB).
Taky je to trochu otázka perspektivy – jestli je pro tebe databáze nějaké nedůležité odkladiště dat a nutné zlo, zatímco primární je aplikace – nebo jestli naopak databáze je něco primárního a trvalého, zatímco aplikace je pomíjivá (můžeš ji třeba po roce zahodit a napsat novou, nebo jich provozovat víc najednou, kdežto databáze je pořád stejná, resp. vyvíjí evolučně).Oboje zároveň - jako nutné zlo mi přijde SQL, tedy pokud s ním mám pracovat. Nevadí mi, že běží někde na pozadí a uznávám, že má pár výhod, jen mě to prostě programátorsky nebaví.
sprintf()
používat snprintf()
, místo strcpy()
používat strncpy()
a podobně), případbně alokovat datové struktury, do kterých se vkládají data z "vnějšího světa", někde jinde než na zásobníku.
BTW: První pokus o bound-checking přímo procesorem byl už v proceroru i80286, kde instrukce BOUND testovala registr vůči dvojici hodnot uložených v paměti. Bohužel Inteláci tuto na první pohled rozumnou instrukci naprosto zabili tím, že místo nastavení příznaků generuje při překročení mezí vyjímku (konkrétně číslo 5) a navíc dává do zásobníku adresu intrukce vyvolávající vyjímku a ne až té následující (stejně jako třeba u chybné instrukce). Tudíž je naprosto nepoužitelná pro uživatelské procesy, které nemohou sahat do IDT a nastavovat si vektory na vlastní obsluhu, a i pro systém je vyjímka a její obsluha zbytečná zátěž.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.