Linux 2.6.25.2 i 2.6.24.7 – ważna poprawka

Alexander Viro znalazł poważny błąd w kodzie VFS, Greg KH zaleca szybki upgrade użytkownikom wersji 2.6.25.x oraz 2.6.24.x.

Cytat z changeloga

Zabezpieczenie przed sytuacjami wyścigowymi w fcntl_setlk()/close() ma subtelną dziurę – musimy się upewnić, że gdy dojdzie do wyścigu fcntl/close na maszynie SMP, kolejność dostępu do tablicy deskryptorów i inode->i_flock nie zostanie zmieniona.

Jeśli się tak stanie, dostajemy STORE inode->i_flock, LOAD descriptor table entry przeciw STORE descriptor table entry, LOAD inode->i_flock bez ani jednej blokady po żadnej ze stron. Mamy BKL (Big Kernel Lock) wokół pierwszego STORE, jednak sprawdzanie w locks_remove_posix() jest poza BKL a są dobre powody dla których nie chcemy BKL w ogólnej ścieżce close(2).

Rozwiązaniem jest zablokowanie ->file_lock wokół fcheck()…

Wprawdzie nie został jeszcze udostępniony żaden exploit wykorzystujący tę lukę, jednak zaleca się przeprowadzenie szybkiej aktualizacji systemu do wersji 2.6.25.2 lub 2.6.24.7.

Błąd zostanie opisany jako CVE-2008-1669 na ulubionej stronie script kiddies.

Update:

Willy Tarreau powiadomił o wydaniu wersji 2.4.36.4 również poprawiającej ten błąd.

żadnych reklam, sama wiedza.

Zarejestruj się na BEZPŁATNY NEWSLETTER i raz w tygodniu otrzymuj najważniejsze wiadmości
ze świata IT, nowych technologii i kryptowalut.

Bez reklam.

  1. Awatar t0m3k__
    t0m3k__

    "Jeśli się tak stanie, dostajemy STORE inode->i_flock, LOAD descriptor table entry przeciw STORE descriptor table entry, LOAD inode->i_flock bez ani jednej blokady po żadnej ze stron. Mamy BKL (Big Kernel Lock) wokół pierwszego STORE, jednak sprawdzanie w locks_remove_posix() jest poza BKL a są dobre powody dla których nie chcemy BKL w ogólnej ścieżce close(2)."

    aha…

    1. Awatar optimizationkit
      optimizationkit

      "aha…"

      To wytłumaczenie jest zrozumiałe dla ludzi rozumiejących dwa zagadnienia związane z Linuksem:
      – VFS – wirtualny system plików
      – blokady

      Nie ukrywam, że zagadnienia związane z VFS są mi zupełnie obce – nigdy nie tworzyłem systemu plików (Musiałem wrzucić jakiś opis – tłumaczenie fragmentu changeloga chyba jest ok – bo przecież nie mogłem puścić newsa "Alexander Viro znalazł poważny błąd w kodzie VFS, Greg KH zaleca szybki upgrade użytkownikom wersji 2.6.25.x oraz 2.6.24.x." 🙂 )

      1. Awatar Z
        Z

        To wytłumaczenie jest zrozumiałe dla ludzi rozumiejących dwa zagadnienia związane z Linuksem

        No jasne – przecież powszechnie wiadomo, że tylko tacy czytają "linuxnews", więc nie wiem, o co chodzi tym malkontentom, tam dalej… 😀

        1. Awatar 3ED
          3ED

          @Z: No pewnie, lepiej nic nie napisać..

    2. Awatar jeronimmo
      jeronimmo

      @ t0m3k__
      Mnie również są obce zagadnienia VFS, niemniej jednak rozumiem mechanizm blokad i dla mnie ten cytat jest czytelny. A nie jestem jakimś über_chakierem 😉

    3. Awatar optimizationkit
      optimizationkit

      Może powinienem wyjaśnić o co chodzi z blokadami, wtedy będzie wszystko jasne 😉

      Wyobraź sobie dwa bloki kodu działające współbieżnie

      — początek bloku 1 —

      zmienna1 = funkcja1(zmienna1)

      — koniec bloku 1 —

      — początek bloku 2 —

      zmienna1 = funkcja2(zmienna1)

      — koniec bloku 2 —

      Ponieważ obydwa bloki kodu działają równocześnie modyfikując zawartość tej samej zmiennej może dojść do takiej sytuacji:
      – wartość początkowa zmiennej zmienna1 wynosi 10
      – w bloku 1 pobierana jest wartość początkowa zmiennej1 i przekazywana do funkcji1
      – w bloku 2 pobierana jest wartość początkowa zmiennej1 i przekazywana do funkcji2
      – funkcja2 w bloku 2 zwraca nową wartość do zmiennej1 obliczoną na podstawie wartości początkowej – powiedzmy, że zwraca 30
      – funkcja1 w bloku 1 zwraca nową wartość do zmiennej1 obliczoną na podstawie wartości początkowej – powiedzmy, że zwraca 20
      Na końcu takiego wyścigu wartość zmiennej1 wynosi 20 (może być 30 – zależy, który blok kodu będzie ostatni). Problem w tym, że wartość zmiennej1 po wywołaniu dwóch funkcji powinna być inna, ponieważ po wykonaniu pierwszej wartość początkowa dla drugiej funkcji jest inna!

      Aby uporządkować takie sytuacje stosuje się tzw. blokowanie np:

      — początek bloku 1 —
      blokujemy(zmienna1)
      zmienna1 = funkcja1(zmienna1)
      odblokowujemy(zmienna1)
      — koniec bloku 1 —

      — początek bloku 2 —
      blokujemy(zmienna1)
      zmienna1 = funkcja2(zmienna1)
      odblokowujemy(zmienna1)
      — koniec bloku 2 —

      W zależności od typu blokady po jej założeniu przez pierwszy blok kodu, drugi może np. czekać aż ten pierwszy nie zwolni blokady i dopiero wtedy może modyfikować zmienna1 albo ma możliwość tylko odczytu zawartości zmiennej (bez prawa do modyfikacji) etc.

      1. Awatar amigib
        amigib

        bardziej łopatologicznie już się chyba nie da, dzięki 🙂

  2. Awatar sarge
    sarge

    Bardzo rzeczowy news na wysokim poziomie, w końcu wiadomo dokładnie o co chodzi. Jeszcze raz gratulacje dla autora. Oby więcej takich.

  3. Awatar cabal
    cabal

    Takie miałem podejrzenia. Może trzeba zmienić nazwę portalu na devlopersnews.pl ?

    1. Awatar lorek123
      lorek123

      no bez przesady ej… moze jeszcze stworzymy portal o nazwie flamewarelinuksvswindowsnews.pl? nie rozdrabniajmy już tak tych portali.

      1. Awatar mith
        mith

        Hej, ale to o developersnews.pl to była ironia 😉

        @optimizationkit: Całkiem fajne objaśnienie mechanizmu blokad.

        @Marudy: Ja się wcale nie dziwię, że optimizationkit wrzucił ten opis. Jeśli news ma dwie linijki, to wszyscy wrzeszczą, że to za krótkie – jest tu presja, żeby mnożyć treści ponad potrzebę. Jeśli ktoś potraktuje nas trochę bardziej zawiłym opisem, to ludzie marudzą, że to jest niezrozumiałe dla mas. Jaki wniosek? Najlepiej każdego newsa opatrzmy kilkustronicowym artykułem omawiającym wyczerpująco wszystkie powiązane z treścią newsa zagadnienia. Oczywiście dołączając odpowiednie diagramy i rysunki. Jeśli ktoś nie ma czasu, niech po prostu nie pisze w ogóle newsów. W ten sposób portal zyska dobrze opracowane, wartościowe teksty – mniej więcej dwa w miesiącu 😉 A o dziurze w kernelu będziemy mogli przeczytać pół roku po opracowaniu exploita. Gdyby ktoś nie zauważył, to też jest ironia 😉

        1. Awatar Thar
          Thar

          Dużo treści niekoniecznie musi oznaczać treść zrozumiałą tylko dla nielicznych, prawda? A jeśli już oznacza, lepiej po prostu takiego niusa nie publikować.

    2. Awatar Jakub Klawiter
      Jakub Klawiter

      Nie no, może treść zawiła ale informacja jest istotna więc dlaczego nie miałaby się pojawić.

      1. Awatar ktoś
        ktoś

        w szczególności, że co co nie rozumieją samego newsa (ja 😛 ) mogą wpisać uname -r, zoabaczyć w odpowiedzi np 2.6.15-51-386 i olać całą sprawę ciepłym moczem, bo jak rozumiem w innych wersjach niż wymienione błędu nie ma.
        A jak się dostanie to co jest w newsie, to też nie będzie bolało, bo po prostu najwyższa pora na upgrade 🙂
        Jak tylko się chce sprawdzić wersję kernela, to nie ma znaczenia na jakim poziomie się jest, i tak mozna z newsa skorzystać

  4. Awatar vampire
    vampire

    b. dobry news na poziomie. Oby wiecej takich!

  5. Awatar vries
    vries

    Przy takich newsach przydałoby się dodać w jaki sposób taka dziura mogłaby zostać wykorzystana. W przeciwnym razie news jest kompletnie bezurzyteczny dla ZU.

    1. Awatar optimizationkit
      optimizationkit

      "w jaki sposób taka dziura mogłaby zostać wykorzystana"

      Strzelam, że da się ją jakoś wykorzystać do zrobienia czegoś złego – ale jak, to naprawdę nie wiem.

      Biorąc pod uwagę, że dziurę znalazł Viro – autor VFS – (pewnie jeszcze w swoim kodzie 😉 w każdym bądź razie na pewno wcześniej go przeglądał, oceniał – wystarczy grep-nąć archiwum LKML, żeby się dowiedzieć jak wyglądają audyty kodu VFS) i zrobił z tego od razu CVE. IMHO sprawa musi być poważna.

      1. Awatar vries
        vries

        Uch, wiedziałem, że znów zostanę opacznie zrozumiany. Bardziej, jakie "zło" może być wyrządzone. Bo "jak" nie wiele daje ZU. Tymczasem nie mam nowej paczki, nie wiem, czy mam się kłopotać kompilacją, czy czekać.

    2. Awatar mith
      mith

      @vires: Dlaczego uważasz, że jest bezużyteczny? Jest bardzo użyteczny: użytkownik (nie lubię skrótu "ZU" – to jak stempel na toksyczne zwierzę!) wie, że ma możliwie szybko zrobić aktualizację.

      1. Awatar Adi1981
        Adi1981

        pewnie by chcieli jeszcze gotowe exploity dostać w newsach, żeby mogli je później na kimś wypróbować 😉

    3. Awatar jarek
      jarek

      Od kiedy ZU wykorzystuje "race condition bug"?
      Jesli ten news mialby byc dla ZU, to powienien wyglada mniej wiecej:
      Wykryto powazna usterke w Linuxie, zalecana pilna aktualizacja.

  6. Awatar xd
    xd

    Nie rozumiem komentarzy czepiających się newsa.

    Ci, którzy nie rozumieją cytatu mogą z newsa wyciągnąć ogólną informację o błędzie. Ci, którzy rozumieją, mogą szybko, bez grzebania samemu w changelogu zrozumieć bardziej zaawansowane szczegóły błędu.

    Moim zdaniem news napisany idealnie.

    1. Awatar uzytkownik
      uzytkownik

      No – o ile rozumiem błąd to można by dodać, że błąd wystęmpuje tylko na SMP(Symmetric multiprocessing) – czyli na systemach wieloprocesorowych, z procesorami wielordzeniowymi i/lub z HT(nie jestem tego pewien.
      To też może być przydatne ZU

  7. Awatar troll132
    troll132

    > Wprawdzie nie został jeszcze udostępniony żaden exploit
    > wykorzystujący tę lukę, jednak zaleca się przeprowadzenie szybkiej
    > aktualizacji systemu do wersji 2.6.25.2 lub 2.6.24.7.

    Ogólnie sytuacje wyścigu kiepsko sploituje się automatycznie, a przynajmniej w takiej postaci żeby przeciętny script kiddie mógł wykorzystać.

  8. Awatar socrtp
    socrtp

    tak czy siak – jest bug i w określonych sytuacjach może się coś złego dziać – niekoniecznie zdobycie lokalnie roota, ale na przykład wyciek/uszkodzenie danych czy niestabilność systemu.

    pytanie – czy bug ten występuje również w starszych kernelach 2.6?

    1. Awatar optimizationkit
      optimizationkit

      Tak, Oliver Pinter opublikował już poprawkę do swojego 2.6.22-op. Adrian Bunk pewnie niedługo też wypuści poprawkę do 2.6.16. Jeśli Willy Tarreau poprawił ten błąd w 2.4.36, to prawdopodobnie występuje on we wszystkich 2.6.x

  9. Awatar amigib
    amigib

    a dopiero co wyszedł nowy slackware i już trza update, heh

  10. Awatar uzytkownik
    uzytkownik

    Być może ja tylko jestem niekumaty. Nie znam się za bardzo na podsystemie VFS w Linuksie, trochę znam problemy z programowaniem wielowątkowym.

    "Jeśli się tak stanie, dostajemy STORE inode->i_flock, LOAD descriptor table entry przeciw STORE descriptor table entry, LOAD inode->i_flock bez ani jednej blokady po żadnej ze stron. Mamy BKL (Big Kernel Lock) wokół pierwszego STORE, jednak sprawdzanie w locks_remove_posix() jest poza BKL a są dobre powody dla których nie chcemy BKL w ogólnej ścieżce close(2)."

    1. Co oznacza "dostajemy … przeciw…"?
    a) Jest to kod na 2 procesorach wykonywany jednocześnie (tak wynika z dalszej części). To nie jest chyba najtrafniejsze tłumaczenie vs. (które chyba było w orginale – zgaduje po tłumaczeniu).
    czy
    b) Jest to kod, który się wykonuje i kod, który powinien się wykonywać
    2. Tłumaczony jest VFS i BKL, które znam (tzn. skróty) a do czego służy funkcja locks_remove_posix?
    3. Czasami dodawanie nowych linii nie szkodzi (nawet w cytatach):
    STORE inode->i_flock
    LOAD descriptor table entry
    vs.:
    STORE descriptor table entry
    LOAD inode->i_flock
    4. Co to jest 'ogólna ścierzka'? Czy chodzi o BKL w close(2)?

    Podsumowując:
    Proszę – tłumaczcie tak, żeby było to zrozumiałe nie tylko dla programistów jądra. Nawet jeśli nie znam dogłębnie tamatu to powinienem to zrozumieć za pierwszym razem a nie po 3 czytaniach (choćby przez prosty zabieg jak w 3.)

    PS. Tak – wiem, że pisanie jest trudne – sam piszę niezrozumiale. I jest to powód dla którego nie piszę 😉

    1. Awatar optimizationkit
      optimizationkit

      "Co oznacza “dostajemy … przeciw…”?"

      To samo co opisałeś w punkcie 3 😉

      "a do czego służy funkcja locks_remove_posix?"

      Czy nie napisałem w komentarzu poniżej newsa, że nie znam VFS?

      "Co to jest ‘ogólna ścierzka’?"

      void foo() {
      funkcja1();
      funkcja2();
      if (jakiś rzadki przypadek) {
      funkcja3();
      }
      }

      Co w powyższym przypadku będzie zawsze wykonywane a co tylko od czasu do czasu? – ścieżka ogólna, to te funkcje, które są wykonywane najczęściej.

      "Proszę – tłumaczcie tak, żeby było to zrozumiałe nie tylko dla programistów jądra" "PS. Tak – wiem, że pisanie jest trudne – sam piszę niezrozumiale. I jest to powód dla którego nie piszę"

      Pisałem to przed 6 rano po niewyspanej nocy… – na pewno dało się napisać lepiej.

    2. Awatar mrupio
      mrupio

      Wydaje mi się, że w tym kontekście "vs." oznacza "zamiast".

  11. Awatar http://myid.pl/id/sk
    http://myid.pl/id/sk

    Nasze ulubione powiedzonko w takich przypadkach:
    "A nie mogłeś od razu dobrze napisać" 😀

  12. Awatar ciekawy
    ciekawy

    Czy dobrze rozumiem ze jest to "groźny" błąd _tylko_ na maszynach SMP ?

    1. Awatar http://myid.pl/id/sk
      http://myid.pl/id/sk

      jedyną maszyną nie-SMP w mojej okolicy jest mój telefon, więc błąd można wykorzystać chyba na wirtualnie każdym współcześnie używanym komputerze.

  13. Awatar pp
    pp

    Oby więcej takich artykułów 🙂

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *