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! luo String-tyyppisen merkkijonon heappiin, ja sen omistaa s-niminen pinossa oleva muuttuja. &s luo viittauksen (eli noin C:n pointteri) tuohon merkkijonoon ja yrittää palauttaa sen funktion paluuarvona. Muuttuja s kuitenkin katoaa pinosta funktion lopussa, joten myös String-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ä.

Lisätietoja

Forbes: Google Issues Warning For 2 Billion Chrome Users

The Rustnomicon: Ownership and Lifetimes