Zephyrnet Logosu

Linux çekirdeği yamaları video sürücüsünde "performans zararlı olabilir" hatası

Tarih:

Son hafızanın korkakça adlandırılmış tüm hatalarını hatırlayın, örneğin spektrum, Meltdown, Siktir et ve RAM kanaması?

Çok gevşek bir şekilde konuşursak, bu tür hatalar - belki de "performans maliyetleri" olarak daha iyi tanımlanırlar - her zamankinden daha hızlı CPU'lara olan talebin bir yan etkisidir, özellikle de artık ortalama bir bilgisayar veya cep telefonunun birden fazla işlemci yongasına sahip olması nedeniyle. , tipik olarak her bir çipte yerleşik olarak birden fazla çekirdek veya işleme alt birimi ile.

Eski günlerde (ki bununla Inmos Transputer gibi çipler çağını kastediyorum), büyük bir işi birçok parçaya böldüğünüz jargonda “paralel hesaplama” olarak bilinen şeyi yapmanın en iyi yolunun, bilgelik olduğunu söyledi. daha küçük olanlar ve aynı anda onlar üzerinde çalışmak, hiçbir kaynağı paylaşmayan çok sayıda küçük ve ucuz işlemciye sahip olmaktı.

Her birinin kendi bellek yongaları vardı, bu da birbirlerinin belleğine dalmaya veya birbirlerinin işlemcisinin durumuna göz atmaya çalışırken donanım senkronizasyonu konusunda endişelenmeleri gerekmediği anlamına geliyordu, çünkü yapamadılar.

1. iş bir ara sonucu iş 2'ye devretmek isterse, bir tür özel iletişim kanalına ihtiyaç duyuldu ve bir CPU'nun diğerinin davranışına kazara müdahale etmesi bu nedenle tamamen önlendi.

Transputer çiplerinin her birinin bir zincir, ağ veya ağ şeklinde bağlanmasına izin veren dört seri veri hattı vardı ve işlerin mevcut ara bağlantı topolojisine uyacak şekilde kodlanması gerekiyordu.

Hiçbir şeyi paylaşmaya karşı her şeyi paylaşma

Bu model denirdi paylaşma-hiçbir şey, ve özellikle her bir CPU'nun son kullanılan verilerin önbelleğe alınmış kopyaları için kendi yerel deposu varsa, birden fazla CPU'nun aynı bellek yongalarını paylaşmasına izin vermenin kendi başına o kadar karmaşık bir sorun olduğu fikrine dayanıyordu. maliyetini - ve performansını ezin - Herşeyi paylaş paralel hesaplama

Ancak, her şeyi paylaş bilgisayarların programlanması, hiçbir şey paylaşma sistemlerinden çok daha kolay çıktı ve genellikle size daha az sayıda işlemci vermelerine rağmen, bilgi işlem gücünüz genel olarak aynı veya daha iyiydi.

Yani hisse-her şey fiyat/performans ve dolayısıyla pazarın nihai olarak gittiği yöndü.

Sonuçta, eğer gerçekten isterseniz, hiçbir şeyi paylaşma tekniklerini kullanarak - örneğin ucuz bir LAN üzerinden veri alışverişi yaparak - her zaman her şeyi paylaşan birkaç paralel bilgisayarı bir araya getirebilir ve her iki dünyanın da en iyisini elde edebilirsiniz.

Paylaşmanın gizli maliyetleri

Ancak, Spectre, Meltdown ve arkadaşlarının bize hatırlatmaya devam ettiği gibi, ayrı işlemci çekirdeklerindeki ayrı programların aynı fiziksel CPU'yu ve bellek yongalarını paylaşmasına izin veren, ancak birbirlerinin ayaklarına basmadan sistem donanımı…

…arkasında hayalet gibi kalıntılar veya diğer programların son zamanlarda nasıl davrandığına dair hikayeler bırakabilir.

Bu spektral kalıntılar bazen diğer programların gerçekte ne yaptığını anlamak için kullanılabilir, hatta belki de şifreler veya şifre çözme anahtarları gibi gizli bilgiler de dahil olmak üzere birlikte çalıştıkları bazı veri değerlerini ortaya çıkarabilir.

Ve bu tür bir aksaklık CVE-2022-0330, Linux çekirdeği hatası Geçen hafta yamalı Intel i915 grafik kartı sürücüsünde.

Intel grafik kartları, ya tek başlarına ya da daha özel, daha yüksek performanslı "oyun tarzı" grafik kartlarının yanında son derece yaygındır ve Linux çalıştıran birçok iş bilgisayarında i915 sürücüsü yüklü olacaktır.

CVE-2022-0330 güvenlik açığı için tuhaf bir isim düşünemiyoruz ve gerçekten de istemiyoruz, bu yüzden ona sadece güvenlik açığı olarak değineceğiz. drm/i915 hata, çünkü en son Linux çekirdeği değişiklik günlüklerinde yamayı bulmak için önerilen arama dizesi budur.

Dürüst olmak gerekirse, bundan yararlanmak isteyen bir saldırganın aşağıdakilere ihtiyaç duyacağı düşünülürse, bu muhtemelen birçok insan için büyük bir endişe yaratacak bir hata değildir:

  • Sisteme yerel erişim. Tabii ki, çok sayıda insanı içerebilen bir bilimsel bilgi işlem ortamında veya bir BT departmanında.
  • GPU'da kod yükleme ve çalıştırma izni. Bir kez daha, bazı ortamlarda, kullanıcılar hırslı oyuncular oldukları için değil, GPU'nun özel programlama için muazzam performansından yararlanmak için grafik işleme birimi (GPU) "kodlama güçlerine" sahip olabilirler - görüntü ve video işlemeden, video işlemeye kadar her şey. kripto madenciliği, kriptografik araştırmalara.

Basitçe söylemek gerekirse, hata TLB olarak bilinen bir işlemci bileşenini içerir. Çeviri Önbelleği.

TLB'ler on yıllardır işlemcilerde yerleşiktir ve performansı artırmak için oradadırlar.

İşlemci, bir kullanıcının programının, örneğin "adres #42" olarak sıraladığı verilerin içeriğini tutmak için şu anda hangi fiziksel bellek yongasının atandığını bulduğunda, TLB, işlemcinin birçok tekrarlanan bellek adresi hesaplamasını yan adıma geçirmesine izin verir. aksi takdirde, örneğin bir program bir döngüde çalışırken gerekli olabilir.

Normal programların “42” gibi sanal adreslere atıfta bulunmasının ve verileri doğrudan belirli çiplerdeki belirli depolama hücrelerine doldurmasına izin verilmemesinin nedeni, güvenlik felaketlerini önlemektir. 1970'lerin ev bilgisayarlarının ihtişamlı günlerinde, sistemdeki herhangi bir bellek kontrolünden kaçınmanıza izin veren BASIC sürümleriyle kodlayan herkes, uygun şekilde adlandırılmış ancak yetersiz sağlanan bir sistemin ne kadar felaket olduğunu bilir. POKE komut olabilir.)

The drm/i915 böcek

Görünüşe göre, eğer anladıysak drm/i915 doğru bir şekilde hata veriyorsa, aşağıdaki şekilde "gıdıklanabilir":

  • X kullanıcısı, "Bu hesaplamayı GPU'da yapın ve hesaplamalar için paylaşılan bellek arabelleği Y'yi kullanın" diyor.
  • İşlemci, GPU sürücüsünün ve kullanıcının arabellek Y'ye hızlı bir şekilde erişmesine yardımcı olmak için bir TLB girişleri listesi oluşturur.
  • Çekirdek, GPU hesaplamalarını tamamlar ve Y arabelleğini başka birinin kullanması için sisteme döndürür.
  • Çekirdek, X kullanıcısına Y arabelleğinin bazı veya tüm bölümlerine "hızlı yol" sağlayan TLB verilerini temizlemez.
  • Kullanıcı X, bu sefer kendi arabelleğini belirtmeden "GPU'da biraz daha kod çalıştır" diyor.

Bu noktada, çekirdek, Kullanıcı X'in ikinci GPU kodunu tamamen yeni, sistem tarafından seçilen bir bellek yığınına eşlese bile, Kullanıcı X'in GPU kodu, eski TLB girişleri aracılığıyla belleğe erişmeye devam edecektir.

Bu nedenle, X Kullanıcısının bazı bellek erişimleri, artık X Kullanıcısına ait olmayan eski bir fiziksel adresten istemeden (veya X kötü niyetliyse kasıtlı olarak) verileri okuyacaktır.

Bu veriler, arabellek Y'nin yeni "sahibi" olan Kullanıcı Z tarafından orada saklanan gizli verileri içerebilir.

Böylece, Kullanıcı X, başka birinin verilerinin parçalarına gerçek zamanlı olarak gizlice göz atabilir ve hatta belki de bu verilerin bir kısmına diğer kişinin arkasından yazabilir.

Sömürü karmaşık olarak kabul edildi

Açıkçası, bu hatayı siber saldırı amacıyla kullanmak son derece karmaşık olacaktır.

Ancak yine de, bellek erişimlerini yeniden değerlendirme ve böylece işleri hızlandırma ihtiyacını ortadan kaldırmak için bir TLB'ye sahip olmak gibi güvenlik kısayolları devreye girdiğinde, güvenliğin tehlikeli bir şekilde aşınabileceğini hatırlatmakta fayda var.

Çözüm basit: her zaman geçersiz kıl veya floş, TLB, bir kullanıcı GPU'da bir kod öbeği çalıştırmayı bitirdiğinde. (Önceki kod, bir başkası yeni GPU kodunu çalıştırmak isteyene kadar bekledi, ancak olası erişim denetimi atlamasını bastırmak için her zaman zamanında kontrol etmedi.)

Bu, GPU'nun "casus sondası" olarak kullanılamamasını sağlar. PEEK başka bir programın güvenle sahip olduğu verilere yasa dışı bir şekilde POKEd'yi kendi özel bellek alanı olarak varsaydığı şeye dönüştürür.

İronik olarak, yama orijinal olarak Ekim 2021'de kodlanmış gibi görünüyor, ancak performansı düşürebileceği endişeleri nedeniyle Linux kaynak koduna eklenmedi ve o sırada doğrudan bir hatadan ziyade bir "yanlış özellik" gibi hissettiren şeyi düzeltti. .

Ne yapalım?

  • En son çekirdek sürümüne yükseltin. Yama ile desteklenen sürümler: 4.4.301, 4.9.299, 4.14.264, 4.19.227, 5.4.175, 5.10.95, 5.15.18 ve 5.16.4.
  • Linux'unuz en son çekirdek sürümüne sahip değilse, thids yamasının yine de "desteklenip desteklenmediğini" görmek için dağıtım sorumlunuzla görüşün.

Bu arada, ihtiyacınız yoksa ve yüklemediyseniz i915 sürücü (ve onu çekirdeğinizde derlenmemiştir), o zaman bu kod modülüne özgü olduğu için bu hatadan etkilenmezsiniz.

Sürücünün derlenip derlenmediğini görmek için şunu deneyin: $ gunzip -c /proc/config.gz | grep CONFIG_DRM_I915= CONFIG_DRM_I915=m <--sürücü bir modüldür (bu nedenle yalnızca talep üzerine yüklenir) Modüler sürücünün yüklü olup olmadığını görmek için şunu deneyin: $ lsmod | grep i915 i915 3014656 19 <--driver yüklendi (ve diğer 19 sürücü tarafından kullanılıyor ttm 77824 1 i915 cec 69632 1 i915 [. . .] video 49152 2 acpi,i915 Linux çekirdek sürümünüzü kontrol etmek için: $ uname -srv Linux 5.15.18 .1 #29 SMP PREEMPT 12 Ocak Cumartesi 16:47:2022 CST XNUMX

spot_img

En Son İstihbarat

spot_img