programmatūra · 6 min · 21.08.2026

Canonical maksā par C pārtaisīšanu Rust valodā: etaloni mēra 1354 rindas, snap-confine ir 13 000

Canonical 19. augustā paziņoja, ka apmaksā trīs gadu doktorantūras pētījumu Bristoles Universitātē ar vienu mērķi: automātiski pārtaisīt lielus C valodas repozitorijus par drošu Rust kodu. Pirmie divi izmēģinājuma objekti ir AppArmor un snap-confine. Abi darbojas Ubuntu drošības pamatos.

Paziņojumu Ubuntu Discourse forumā publicēja Canonical inženieris James Guthrie. Pētījumu vada profesors Meng Wang, līdzvadītāji ir Dr. Cristina David un pats Guthrie. Vietu ieguva Alex Wood ar iepriekšēju pieredzi kompilatoru būvē, Rust valodā un kriptogrāfijā. Naudu dod Canonical kopā ar UK Research and Innovation līdzfinansējumu.

Konveijers no četrām daļām

Sistēma iecerēta kā četru soļu ķēde. Pirmais solis sadala repozitoriju mazākos gabalos tā, lai tipi un savstarpējās atkarības paliktu vienā kontekstā. Otrais dod šos gabalus valodas modelim, kas apmācīts uz zināmiem C un Rust pāriem. Trešais pārbauda iznākumu ar fuzz testiem un formālu ekvivalences pārbaudi. Ceturtais ar simboliskām metodēm labo vietas, kur tulkojums izgāzās.

Canonical šo pieeju sauc par neirosimbolisku: mašīnmācīšanās raksta kodu, klasiskā programmu analīze to pārbauda. Iemesls dalījumam ir praktisks. Valodas modeļiem pietrūkst konteksta veselam repozitorijam. Vecie likumbāzētie tulkotāji savukārt pārnes C struktūru pārāk burtiski. Rezultāts pēc tam jāpārraksta ar rokām.

Guthrie ieraksta centrālais teikums nosaka, kā projekts izturas pret modeļa izvadi:

Ģenerēts kods jāuzskata par neuzticamu, kamēr nav pierādījumu, ka tas saglabā vēlamo uzvedību.

Etaloni ir desmit reizes mazāki par īsto kodu

Cik tālu automātiskā tulkošana pašlaik aizgājusi, rāda šī gada aprīlī publicētais ORBIT darbs. Uz CRUST-Bench kopas 24 programmām ORBIT nokārto kompilāciju visos 24 gadījumos un testus 22 gadījumos jeb 91,7 %. Vecais likumbāzētais c2rust nokompilē 15 programmas no 24 un testus iztur piecās. Vēl lielāka atšķirība redzama unsafe blokos: pēc c2rust vidēji 69,6 % rindu ir unsafe, pēc ORBIT tikai 0,06 %.

Tomēr šo 24 programmu mediānais izmērs ir 1354 rindas. Vidējais ir 1603. snap-confine avoti snapd repozitorijā ir citā kategorijā. Mapē cmd/snap-confine 25 ne-testa .c un .h faili dod 6274 rindas. Privātā palīgbibliotēka cmd/libsnap-confine-private pievieno vēl 6633 rindas 45 failos. Kopā gandrīz 13 000 rindu, aptuveni deviņas reizes vairāk par etalonu mediānu. Tieši to Canonical arī raksta: nobrieduši drošībai kritiski projekti nes sarežģītību, kādas etalonos nav.

Grūtākais ir trešais solis. snap-confine ir setuid root programma, kas pirms lietotnes palaišanas uzstāda atsevišķu montēšanas nosaukumtelpu, uzliek seccomp filtru un pārslēdz AppArmor profilu. Lielākais viens fails šajā mapē ir mount-support.c ar aptuveni 49 KB koda. Šādu programmu nevar pārbaudīt, vienkārši palaižot to ar nejaušiem argumentiem: tās uzvedība ir atkarīga no kodola versijas, no /proc satura un no tā, kas tā brīdī notīra pagaidu direktorijas. Formāla ekvivalences pārbaude šeit nozīmē salīdzināt nevis divas funkcijas, bet divas sistēmas izsaukumu virknes.

AppArmor parserī ir arī C++

Otrais izmēģinājuma objekts uzdod grūtāku jautājumu. AppArmor politikas parserī, kas atrodas augšteces repozitorija mapē parser, ir 15 .c faili, 31 galvas fails un 17 .cc faili. Tur ir arī parser_lex.l un parser_yacc.y, tas ir, flex un bison gramatika, no kuras kompilācijas laikā tiek uzģenerēts vēl viens C koda slānis. C uz Rust tulkotājam ar C++ klasēm un ģenerētu parseri nav ko darīt bez atsevišķa risinājuma katram gadījumam.

Canonical uzsver, ka ne AppArmor, ne snap-confine šobrīd netiek pārrakstīts Rust valodā. Abi ir tikai pētījuma paraugi. Plāna aizstāt esošās versijas ar pētījuma rezultātu nav. Interesē cits jautājums: kādi pierādījumi uzturētājiem vajadzīgi, lai uzticētos automātiski pārtulkotam produkcijas kodam.

Kļūda, ko Rust nebūtu apturējusi

snap-confine šogad jau saņēma nopietnu labojumu. Qualys pētnieki martā aprakstīja CVE-2026-3888, kas Ubuntu Desktop 24.04 un jaunākās noklusējuma instalācijās ļauj nepriviliģētam lietotājam kļūt par root. Uzbrukuma shēma: systemd-tmpfiles izdzēš novecojušu pagaidu direktoriju, lietotājs to izveido atkārtoti ar saviem failiem. Nākamajā smilškastes sagatavošanas reizē snap-confine šos ceļus piemontē ar root tiesībām. Qualys tam deva CVSS 7,8 balles. Labojums iznāca ar Ubuntu drošības ziņojumu USN-8102-1.

Šī ir sacensības stāvokļa un uzticēšanās kļūda, nevis atmiņas pārrakstīšanas kļūda. Rust aizņēmumu pārbaudītājs to nebūtu novērsis. Tas ierobežo, ko no visa pasākuma vispār var gaidīt: automātiska tulkošana Rust valodā aizver vienu kļūdu klasi, nevis visas.

Konteksts Ubuntu iekšienē

Canonical Rust kodu sistēmas pamatā liek jau tagad. Ubuntu 25.10 par noklusējumu padarīja uutils coreutils un sudo-rs. Tie aizvieto GNU rīkus, kas datoros stāvēja gadu desmitiem. Atšķirība ir tā, ka abi šie projekti ir cilvēku rakstīti no nulles. Bristoles pētījums pārbauda, vai to pašu darbu var padarīt mašīna, kuras izvadu pēc tam kāds spēj arī pierādīt.

Alex Wood pie darba sāk šī gada otrajā pusē. Trīs gadu termiņš nozīmē, ka pirmie pilnie rezultāti pienāks 2029. gadā.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie