Revolutionen vi har ventet på
Så er Robert Watson's CHERI ankommet, dvs. bygget ind i ARM Neoverse N1 processor!
Det er den første rigtige revolution i CPU arkitektur i min levetid og det bliver forhåbentlig standard i alle CPU-arkitekturer fremover.
Kogt helt ind til benet, går CHERI ud på at pointere ikke kan skabes, men kun nedarves.
Når CPU'en booter, har den én eneste pointer, der peger på addresse nul og den har tilladelse at tilgå al hukommelse med R, W & E.
Alle andre pointere skal specialiseres ud fra denne "ur-pointer", de kan ikke mere laves ved at tage mere eller mindre tilfældige heltal og påstå at de er pointere.
For at sikre dette, er der et ekstra bit i hukommelsen, der markerer hvor der ligger "rigtige" pointere og hvis man overskriver, f.eks med memcpy()
bliver det bit slettet.
Her er et godt blogindlæg fra Microsoft om hvor vildt banebrydende CHERI er.
CHERI ville altid have fanget 43% af de sikkerhedsfejl der blev sendt til MSRC i 2019.
Kæmpe hat-tip til min ven Professor(!) Robert Watson!
phk
- emailE-mail
- linkKopier link

- Sortér efter chevron_right
- Trådet debat
Det er lidt sent at fange pointerfejl på køretid, selv om det er bedre end aldrig.
Hvis vi taler hackning og huller i sikkerhed, så er det vel sådan fejl man selv laver for at komme uden om kernesikkerhed.
Altså at det ikke er OS, men CPU som skaber en del af sikkerheden. Altså en forbedret sikkerhed i Hardware, som ikke kan omgåes af (beviste)fejl i software.
Som jeg forstod det på PHK indlæg ?
- more_vert
- insert_linkKopier link
Den phkmalloc
jeg skrev kunne lave en masse check og da jeg i sin tid præsenterede den på USENIX startede jeg med en slide med programmer jeg havde fundet malloc fejl i. Det var, som en af tilhørerne bemærkede, en ret komplet liste af setuid(2) programmer.
- more_vert
- insert_linkKopier link
Det er en helt normal operation og selvfølgelig kan du det.
Det du ikke kan på "normal" hardware, er at begrænse længden af den forreste afledte pointer.
Man kan idag godt lave en malloc der mmap'er alle allokationer så de ligger i slutningen af en VM page, på den måde giver man de returnerede elementer en "HW-længde". Specielt med 64 bit addresserum burde folk gøre dette mere under test/coverage kørsler. Men der er ingen måde at begrænse længden hvis man "deler" det man får tilbage fra malloc.
Med compiler support vil meget af dette ske automatisk:
struct foo {
char buf[1024];
struct bar bask;
};
struct foo *foop = get_me_a_foo(); // længde = sizeof(struct foo);
strcpy(foo->buf, "Blablabla"); // strcpy får pointer med længde 1024
baskit(&foo->bask, foo->buf); // arg1 længde = sizeof(struct bar) osv.
- more_vert
- insert_linkKopier link
Modsiger du ikke dig selv med de to udsagn?
Nej, egentlig ikke. Med "nutidig performance" mener jeg implict "Glem alt om MACH og andet message-passing." der kører ca. 1/100 af nutidig performance.
(Retfærdigvis skal så siges: Hvis nu vi fik HW-support for messagepassing over intra-CPU backbone, der jo allerede er message-passing i hardware, så ville MACH pludselig blive rigtig interessant, særligt hvis det også havde CHERI :-)
- more_vert
- insert_linkKopier link
Det er ikke helt det samme, for det vil ikke fange, hvis du adresserer langt forbi stopmærkerne. Men nogen dårlig ide er det ikke.
- more_vert
- insert_linkKopier link
Ville det ikke være relativt nemt at lave to pointere ud fra en ved at dele størrelsen over i to dele? Eller mangler der support for den operation?
- more_vert
- insert_linkKopier link
Vis mig en operativsystemkerne med nutidig performance skrevet i et sådant sprog ?
For min skyld er det OK hvis de kører halv hastighed: hellere sikkert end hurtigt.
Modsiger du ikke dig selv med de to udsagn?
- more_vert
- insert_linkKopier link
Vi (en god kollega) implementerede noget tilsvarende i SW i hedengangne Ambrasoft, hvor alle der lavede bank-SW i C var forpligtiget til at bruge den specielle version af malloc og free. Følgende er efter hukommelse, da det trods alt er ca. 30 år siden:
'new_malloc' allokerede og skrev nogle ekstra bytes i hver ende af det allokerede mener det var "xx>>" og "<<xx" og returnerede en pointer til alloc_mem+4 :)
'xx' var en identifier og 'new_free' undersøgte at der ikke var overskrevet ved frigivelse. Hvis det var tilfældet kunne man skrive til log eller longjmp til en fejlrutine etc. på den måde fandt vi faktisk en del af den slags fejl.
- more_vert
- insert_linkKopier link
Vil den kunne fange en sådan fejl?
Ja, hvis din "overloadet new" laver ny afledte pointere.
Når du får en "klump memory" består din pointer af:
{magisk_bit, addresse, længde}
Du kan kun modificere en pointer på to måder:
Du kan flytte addressen længere frem, men hardwaren vil reducere længdefeltet tilsvarende, i existerende kode vil dette ske uden du overhovedet behøver gøre noget.
Men du får også en ny pointer-operation til udtrykkeligt at reducere længden.
Ideelt set vil compilere selv kunne indsætte denne, hvor de kan se at det er det der foregår, men det afhænger af sprogets semantik.
Et sted hvor compileren ikke kan gøre det, er netop memory-allocation, her skal der et par ekstra operationer ind for at "skære pointeren til" inden den returneres.
Det er heller ikke alle modeller af memory-allocation, eller rettere memory-free der er mulige. Man kan f.eks ikke lave K&R tricket med at "der liggere en next/prev pointer lige foran" osv.
- more_vert
- insert_linkKopier link
Efter at have læst Microsoft artikel er jeg ikke sikker på jeg forstår helt hvordan denne hardware pointer vil kunne fungere hvis man allokere en større klump memory hvor efter en overloadet new deler ud af denne klump til den samme type objekter, hvor der er en tekststreng i. Nu adresseres der ved en fejl uden for tekststrengen område og kommer herved til at overskirve et andet object. Vil den kunne fange en sådan fejl?
- more_vert
- insert_linkKopier link
For min skyld er det OK hvis de kører halv hastighed: hellere sikkert end hurtigt.
Al software burde testes på den slags processorer.
- more_vert
- insert_linkKopier link
Sproget og programmeringen er stadigt vigtigt.
CHERI kan vel ikke gøre andet end at lave en exception, og hvad så? I mange tilfælde går pointer sjusk godt, så nok vil en række sikkerhedshuller blive lukket, men vi risikerer at programmerne begynder at få nye fejl. Forhåbentligt fanger testen de fleste.
- more_vert
- insert_linkKopier link
Ved du, om de har lavet benchmarks på deres CheriBSD?
Indtil nu har de kun haft software og FPGA emuleringer af CHERI, så jeg ved ikke rigtig hvor brugbart evt. benchmarking er.
Det primære impact er at pointere fylder mere i hukommelsen.
For min skyld er det OK hvis de kører halv hastighed: hellere sikkert end hurtigt.
- more_vert
- insert_linkKopier link
Vis mig en operativsystemkerne med nutidig performance skrevet i et sådant sprog ?
Trods den skepsis overfor projektet, jeg ovenfor har givet udtryk for, så synes jeg absolut at det er et spændende projekt.
Jeg kan se, at de har lavet en version af FreeBSD, som de har kaldt CheriBSD.
Ved du, om de har lavet benchmarks på deres CheriBSD? Hvis Microsofts påstand om at "You can also run non-CHERI software on a CHERI system just as you can run 32-bit software on most 64-bit processors." står til troende, så burde det være muligt at afvikle en vanilla FreeBSD på samme system, som de har afviklet CheriBSD på. Men jeg kan ikke umiddelbart finde nogen indikationer på deres performance.
Jeg vil naivt antage at et program der bruger 128 bit i stedet for 64 bit må opleve en vis degradering af performance. Men jeg har ikke fundet noget, der bekræfter min antagelse eller blot giver en nogenlunde indikation af hvor stort et tab det vil give.
- more_vert
- insert_linkKopier link
Vis mig en operativsystemkerne med nutidig performance skrevet i et sådant sprog ?
Du sætter godt nok barren højt, når du helt ukvalificeret skriver "nutidig performance".
Jeremy Soller fra System76 har haft travlt med at lave et nyt Desktop Environment til Pop!_OS, og det betyder desværre nok at Redox OS aldrig bliver "færdigt" eller blot godt nok til daglig brug. Ellers ville det nok have været et godt bud.
- more_vert
- insert_linkKopier link
Sprogene bør laves, så det er umuligt at lave pointerfejl,
Vis mig en operativsystemkerne med nutidig performance skrevet i et sådant sprog ?
- more_vert
- insert_linkKopier link
Det er lidt sent at fange pointerfejl på køretid, selv om det er bedre end aldrig.
Sprogene bør laves, så det er umuligt at lave pointerfejl, da alle sådanne ville blive fanget på oversættelsestidspunktet af typesystemet -- eller slet ikke forekomme fordi pointere på forhånd (dvs. at det ikke først checkes på køretid) er begrænset til at blive oprettet og fulgt (med offsets inden for det allokerede), og det de peger på først fjernes, når der ikke er flere pointere til dem. Sidstnævnte kan gøres med garbage collection eller ved at typesystemet holder øje med ejerskab og levetid (som i Rust eller med regionsinferens).
Jovist, det er rart at kunne oversætte C, men det kan man også gøres ved at lade compileren indsætte checks hver gang, man følger eller opdaterer en pointer, så man statisk kan garantere, at man holder sig inden for grænserne af allokeringen. CHERI er reelt bare hardwaresupport, der garanterer at sådanne checks laves inden pointeroperationer, så man statisk er sikker på, at snavns opdages -- dog med køretidschecks som omkostning). Men det ville være bedre helt at kunne undvære at skulle lave sådanne checks på køretid (uanset om hardwaresupport nedsætter tidsforbruget og sikrer, at de rent faktisk laves). Det vil kræve maskinsprog med typer, der kan sikre pointer-safety INDEN et program køres, uden at skulle lave checks på køretid). Inden brugerkode eksekveres, bliver det checket for typekorrekthed (af et program, der er typechecket inden det lægges i operativsystemet). Der kan være behov for, at koden annoteres med information, der gør verifikation nemmere (proof-carrying code).
- more_vert
- insert_linkKopier link
Det var nok lidt moraliserende.
Og her er lidt mere: For 47 år siden, lærte jeg i gymnasiet (1.g) at matematik var "anvendt dovenskab". Vi havde kun Bjørn det første år, men de "sproglige" havde ham lidt mere.
Sjusk er mig bekendt forbeholdt de "produktive", der tror de kan det (IT).
Vi andre har meget glæde af "krøllede hjerner", som DPs.
- more_vert
- insert_linkKopier link
Programmørene skal også leve, det gør de kun, hvis de skriver kode.
Programmører lever ikke af kode alene.
Men mere relevant, så er der mange andre muligheder for at skabe problemer/katastrofer ved at sjuske. Om dovenskab er en fejl eller en dyd, er jeg usikker på. Spørgsmålet er, hvad man bruger sin dovenskab til. Elegant og gennemskuelig (og fungerende) kode er dovenskab på langt sigt. Sjusk er masser af arbejde på langt sigt og dermed gruelig flid (eller til man søger andre steder hen).
Det var nok lidt moraliserende.
- more_vert
- insert_linkKopier link
så mangler vi bare at få stoppet sjusket software udvikling.
Fleksibilitet og dovenskab (sjusk) er sjældent en god kombination; hvis det nok at gøre "ingenting", ved vi jo godt hvordan det ender. Programmørene skal også leve, det gør de kun, hvis de skriver kode.
- more_vert
- insert_linkKopier link
Det er vel egentligt meget præcis at den her udvidelse gør.
Jo, men den gør det jo ikke af sig selv.
Ifølge bloggen fra Microsoft skal softwaren omskrives til at drage fordel af den nye arkitektur
Og det er tilsyneladende ikke engang nødvendigt at gøre brug af forbedringerne.C/C++ software is at best source compatible (requiring a recompile) and typically requires at least some small source code modification, at least if you want any of the security benefits.
Umiddelbart vil jeg hellere sætte mine penge på nyere sprog som Rust. Men under alle omstændigheder er det glædeligt at se at der er en trend væk fra den overdrevne brug af C med usikker pointeraritmetik.You can also run non-CHERI software on a CHERI system just as you can run 32-bit software on most 64-bit processors.
- more_vert
- insert_linkKopier link
Det er vel egentligt meget præcis at den her udvidelse gør.
- more_vert
- insert_linkKopier link
så mangler vi bare at få stoppet sjusket software udvikling. Det kan nok ikke fixes i hardware.
- more_vert
- insert_linkKopier link
For dem, der vil vide lidt mere er her en FAQ:CHERI FAQ at University of Cambridge
- more_vert
- insert_linkKopier link