Vulnerabilidade na biblioteca estándar Rust

Identificouse unha vulnerabilidade (CVE-2022-21658) na biblioteca estándar de Rust debido a unha condición de carreira na función std::fs::remove_dir_all(). Se esta función se usa para eliminar ficheiros temporais nunha aplicación privilexiada, un atacante pode lograr a eliminación de ficheiros e directorios do sistema arbitrarios que o atacante normalmente non tería acceso para eliminar.

A vulnerabilidade é causada pola implementación incorrecta de comprobar as ligazóns simbólicas antes de eliminar directorios de forma recursiva. En lugar de evitar que se sigan as ligazóns simbólicas, remove_dir_all() comproba primeiro se o ficheiro é unha ligazón simbólica. Se se define unha ligazón, elimínase como un ficheiro e, se é un directorio, chámase unha operación de eliminación de contido recursiva. O problema é que hai un lixeiro atraso entre a comprobación e o inicio da operación de eliminación.

Nun momento no que a comprobación xa se realizou, pero aínda non comezou a operación de enumeración de directorios para a súa eliminación, o atacante pode substituír o directorio por ficheiros temporais cunha ligazón simbólica. Se chega no momento adecuado, a función remove_dir_all() tratará a ligazón simbólica como un directorio e comezará a eliminar o contido ao que apunta a ligazón. A pesar de que o éxito do ataque depende da precisión do momento escollido para substituír o directorio e acertar o momento adecuado a primeira vez que é improbable, durante os experimentos os investigadores puideron lograr un ataque repetible e exitoso despois de executar o exploit dentro de uns segundos.

Todas as versións de Rust desde 1.0.0 ata 1.58.0 inclusive están afectadas. O problema resolveuse en forma de parche polo momento (a corrección incluirase na versión 1.58.1, que se espera dentro dunhas horas). Pode supervisar a eliminación da vulnerabilidade nas distribucións nestas páxinas: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Recoméndase a todos os usuarios de programas Rust que se executen con privilexios elevados e que utilicen a función remove_dir_all que actualicen con urxencia Rust á versión 1.58.1. É interesante que o parche lanzado non resolve o problema en todos os sistemas; por exemplo, en REDOX OS e versións de macOS anteriores á 10.10 (Yosemite), a vulnerabilidade non está bloqueada debido á ausencia da bandeira O_NOFOLLOW, que desactiva o seguimento simbólico. ligazóns.

Fonte: opennet.ru

Engadir un comentario