Chromessa kriittisiä haavoittuvuuksia
Google on varoittanut Chromen käyttäjiä viidestä kriittisestä turvallisuusbugista Chromessa.
- High — CVE-2021-30606: Use after free in Blink. Reported by Nan Wang
- High — CVE-2021-30607: Use after free in Permissions. Reported by Weipeng Jiang
- High — CVE-2021-30608: Use after free in Web Share. Reported by Viettel Cyber Security
- High — CVE-2021-30609: Use after free in Sign-In. Reported by raven
- High — CVE-2021-30610: Use after free in Extensions API. Reported by Vivaldi
Jokainen näistä virheistä on muistiobjektin käyttö sen vapauttamisen jälkeen.
Rust havaitsee use-after-free -bugit käännösaikana
Kuten muistamme, Rustissa kääntäjä takaa, ettei se päästä läpi ohjemaa, joka yrittää käyttää muistiobjekteja vapautuksen jälkeen.
Esimerkiksi seuraava koodi aiheuttaa kääntäjän virheilmoituksen:
fn as_str(data: &u32) -> &str {
let s = format!("{}", data);
&s
}
Heappiin luodun merkkijonon omistaa muuttuja s
, joka automaattisesti poistetaan funktion lopussa. Muuttujan poistamisen mukana poistetaan myös automaattisesti muistiobjektit, jotka se omistaa. Funktio yrittää kuitenkin palauttaa viittauksen tuohon olemattomaan merkkijonoon, mikä huomataan käännösaikana.
Tarkempi selitys:
format!
luoString
-tyyppisen merkkijonon heappiin, ja sen omistaas
-niminen pinossa oleva muuttuja.&s
luo viittauksen (eli noin C:n pointteri) tuohon merkkijonoon ja yrittää palauttaa sen funktion paluuarvona. Muuttujas
kuitenkin katoaa pinosta funktion lopussa, joten myösString
-objekti poistetaan heapista. Funktion lopussa huomataan, että objektiin on vielä viittaus, joten se on virhe.
error[E0515]: cannot return reference to local variable 's'
--> src/lib.rs:9:5
|
9 | &s
| ^^ returns a reference to data owned by the current function
error: aborting due to previous error
For more information about this error, try 'rustc --explain E0515'.
error: could not compile 'playground'
To learn more, run the command again with --verbose.
Rustin virheilmoitus on tavanomaisen perusteellinen.
Rustissa dynaamisilla muistiobjekteilla on aina omistaja staattisissa pino-objekteissa. Omistaja ja vain omistaja voi vapauttaa muistiobjektin. Omistajuus loppuu muistiobjektin vapautukseen, joten kukaan ei voi yrittää käyttää tai vapauttaa uudelleen muistiobjektia, joka on jo vapautettu.
Kaikki nämä turvallisuuskriittiset bugit olisi voitu välttää käyttämällä Rust-ohjelmointikieltä.