Bir sistemdeki tüm boş alanı tahsis ederek başka bir programdan hafıza okumak mümkün mü?


26

Teorik olarak, kullanılmayan tüm hafızayı bir sisteme tahsis eden ve artık ihtiyaç duymadıkları bir başka hafızaya bırakılmış uygulama olarak daha fazla hafıza talep etmeye devam eden bir program oluşturmam ve yeni ihtiyaç duydukları hafızayı başka bir uygulamadan okumak mümkün olacak mıydı? ? Yoksa bu bir şekilde modern işletim sistemiyle korunuyor mu?

Bunun için pratik bir uygulamam yok, merak ediyorum. Gerçek hayatta "mevcut tüm hafızayı" tahsis etmenin bazı sorunları olduğunu biliyorum.

Düzenleme: Açıklığa kavuşturmak için, şu anda başka bir uygulama tarafından tahsis edilen hafızaya erişmemek için özellikle "Serbest Bırakılmış" hafıza hakkında soruyorum.

Yanıtlar:


23

Hayır, çünkü iyi bir çekirdek, önerdiğiniz saldırı türüne karşı tam olarak korumaya yönelik bir işlem yapılmadan önce bellek içeriğini siler.

Unixy sistemlerinde, bellek, program sonu adı verilen, bir sürecin kullanabileceği neredeyse adreslenebilir alanın sınırı olan genişletilerek işlemlere tahsis edilir . Bir işlem, çekirdeğe adreslenebilir alanını genişletmek istediğini söyler ve çekirdek kullanılabilir bellek varsa izin verir veya arama başarısız olursa başarısız olur. ( brk()Sistem çağrısının adı bu konseptten gelir.)

Uygulamada, büyük serbest belleğin blokları genellikle programın kırılmasına karşı çıkmaz, bu da bir işlemin programın kopmasını daraltarak belleği çekirdeğe döndürmesi için gerekli olan şeydir. Elbette bu, sisteminizin malloc()ve uygulamasının uygulanmasına bağlıdır free(). Kullanılabilir kaynaklarınız varsa, size belleğin geri gelip gelmediğini size söylerler.

malloc()Belleği başlatmamanın hiçbir güvenlik etkisi yoktur, çünkü brk()geçtiği herhangi bir şey temizlenir ve daha önce free()aynı olan herhangi bir şey yazılır.


19

Evet, başka bir işlemi 'serbest bırakılmış hafızayı okumak teorik olarak mümkün. Günün geri kalanı için bir dizi ayrıcalık tırmanma saldırısının kaynağıydı. Bu nedenle, işletim sistemleri günümüzde daha önce başka bir işlem tarafından tahsis edilmişse etkin bir şekilde belleği sıfırlar. Her zaman sıfırlanmış bellek görmemenizin nedeni, daha önce aynı işlem tarafından tahsis edilmişse, belleği sıfırlamamak için daha verimli olmasıdır. İşletim sistemi, eğer mümkünse bellek sayfalarını aynı işleme geri vermeye çalışır.


1
"Evet ama hayır", "hayır" dır. @Blrfl doğru.
Ross Patterson,

4
@RossPatterson: Teorik olarak, Karl aslında benden daha doğru. Pratik gerçek şu ki, ana işletim sistemleri bu deliği yıllar önce kapattı.
Blrfl,

@ Blrfl Anlaşıldı. Ancak “yıllar önce”, sayfalama sistemleri ve sanal belleğin ilk tanıtıldığı 1960'ların sonlarındaydı. Kesinlikle Multics, VM / 370 ve OS / VS zamanlarında. Hataların bulunmaması, çoğu uygulayıcı programcının hafızasında bu mümkün olmamıştır.
Ross Patterson

The reason you don't always see zeroed out memory is because it is more efficient not to zero out the memory if it was previously allocated by the same process Burada bazı tutarsızlıklar görüyorum. "Aynı yürütülebilir dosya" mı demek istediniz? Disk yolu ile sıfırlanıp sıfırlanmayacağı nasıl kontrol edilir?
jakub.g

1
Sanırım bir şeyleri özlüyorum. Öyleyse, başlatılmamış tamsayılarla bazı C ++ programlarını derleyip çalıştırdığımda, bu değişkenleri okuduğumda 0'a eşit değillerdir?
jakub.g

2

Burada yanıtı etkileyen birkaç katman var.

Modern bir sanal bellek işletim sistemi varsayarsanız, ayırdığınız sayfalardaki başka işlem verilerinin kalıntılarını göremezsiniz.

Bir işlem ilk kez yüklendiğinde, sayfa tablosu yüklenir ve potansiyel olarak gerçek bellek çerçeveleri bu sayfalara tahsis edilir. En azından, sayfa tablosu veya tamamlayıcı tablosu, işlemin atayabileceği tüm belleğin bir haritasını içerecektir. Bu aynı zamanda yukarıda belirtilen başlangıçtaki işlem molasının başladığı yerdir.

Malloc (), sürece izin veriliyorsa, işlemin değişmesine neden olurken, isteği karşılamak için işlemler sayfasına (tamamlayıcı sayfa) tabloya daha fazla sayfa eklemek, bir işlemin "başka bir tane alabileceği" işlem verilerini alt gerçek bellek katmanı.

Bu senaryoların her ikisinde de, talep çağrısı veya tembel tahsisi kullanan modern bir işletim sistemi henüz fiziksel bellek (çerçeveler) tahsis etmemektedir. İşletim sistemi, sadece bu işlem için hangi sanal belleğin geçerli olduğu hakkında not alıyor. Gerçek bellek yalnızca gerektiğinde atanır.

Sanal sayfa gerçekleştiğinde ve bir işlemler sayfası tablosuna eşlendiğinde, fiziksel bellek veya çerçeveler bir işleme ayrılır. Bu, verilerin gösterilme potansiyelinin bulunduğu yerdir. Bu, sayfa hatası sırasında olur. Maruziyet, önceki bir işlem aynı kareyi kullanıyor olabilir ve mevcut fiziksel bellek talebine yer açmak için verileri terk edilmiş veya değiştirilmiş olabilir. İşletim sistemi, talep eden işlem verilerinin prosese devam etmeden önce uygun şekilde değiştirildiğinden veya çerçevenin temizlendiğinden (sıfırlandı) emin olmak için dikkatli olmalıdır. Bu aynı zamanda yukarıda “eski ama çözülmüş” bir problem olarak da belirtilmiştir.

Bu, diğer işlem belleğinin "serbest bırakılmış" olup olmadığının bir şekilde ilgisiz olmasını sağlar. Başka bir işlem "serbest bırakılmış" bellek, hala bu işleme atanan sayfalarda bulunur ve genellikle bellek azaldığında veya başka bir şekilde tahliye edildiklerinde takas edilecekleri için işlem bitene kadar genellikle eşleştirilmez. malloc () ve free (), (kullanıcı) düzeyinde işleme atanan sanal belleği yönetir.

Sorunuzda, işleminiz teoride, diğer tüm işlemleri hafızadan çıkarmak için daha fazla hafıza talep etmeye devam ediyor. Gerçekte, cevabı etkileyebilecek küresel ve yerel - çerçeve tahsis stratejileri vardır. İşletim sisteminin ve diğer tüm işlemlerin üstesinden gelmesine izin verilmeden önce işlemin kendi sayfalarını bellekten zorlaması olasıdır. Bu ilk sorunun ötesinde olsa da.

Bütün bunlar MS-DOS gibi bir sistemde tartışmalı. MS-DOS (ve diğer basit sistemler), sanal belleği kullanmaz (kendi başlarına) ve başka bir "işlem" verisinde kolayca dürtme ve prodüksiyon yapabilirsiniz.

Linux kaynak kodundan anlaşılması daha kolay olabilecek bazı iyi referanslar, iyi bir işletim sistemi ders kitabı, Silberscatz'ın İşletim Sistemleri Kavramları, Gavin ve Gange veya Andrew Tanenbaum'un İşletim Sistemleri Tasarımı olabilir. Ayrıca Berkeley'den Nachos ya da Stanford'dan Pintos gibi şeyler öğrenmek için inşa edilmiş küçük işletim sistemleridir ve içinde aynı fikirleri vardır.


0

Bunu 16.04 ay önce Ubuntu'da denedim. Tıpkı 0xACE'in dediği gibi, modern işletim sistemi malloc () işlevini çağırdıktan sonra tamamen sıfır, sanal bir sayfa ayırır. Ancak, tahsis edilen ara belleğe hiçbir şey yazmazsanız, fiziksel belleğe eşleştirilmez (yani, üzerine yazma ilkesi), bu nedenle her zaman "başlatılmamış" bir bloktan sıfırları okuyacaksınız. Belki daha iyi performans için "CONFIG_MMAP_ALLOW_UNITIALIZED" seçeneğiyle derlenen bazı işletim sistemleri vardır, bu durumda ne beklediğinizi elde edebilirsiniz.


-1

Hayır, bu çağrı sihri sayesinde başka bir programın diğerinin hafızasını okumasına izin vermez . Bu şekilde, toplam bellek kullanımı, parçalarını sabit sürücüye boşaltarak fiziksel koç aşabilir.

Ayrıca, bir işlemin atayabileceği maksimum bellek, işletim sistemi tarafından keyfi bir şekilde sınırlandırılır (32 bitlik mimari için 4 konser) ve bundan sonra bir sonraki allocaramada bellek yetersiz hatası verir.


Bunu atlatabilecek platforma özel API'ler yok mu? Gerçekten bilmiyorum, ama şaşırmam (örneğin, Linux işletim sisteminin bir sayfadan fiziksel bellekten çıkmasını önlemeye izin verir mlock).

4 GB RAM varsa ve disk belleği 8 GB ile sınırlıysa, uygulama 12 GB isterse (x64'de)?
Arseni Mourzenko

Daha sonra sistem çağrıları bir kalmamıştı olduğunda çok az boş bellek ... bilgisayar basitçe durma noktasına olacağı ya, kalacak hatayı dönmelidir
mandal ucube

4
Başka birisinin hafızasını okumaktan ziyade, RELEASED hafızasını okumaktan hoşlanıyor. Ram'ın bu bölümü şu anda boş ve ... sanmıyorum ki ... sayfalama serbest bırakıldıktan sonra sıfırı sıfırlıyor. Böylece program bir bellek bloğu tahsis eder ve zaten mevcut olan başlatılmamış verileri analiz eder.
Philip

@ philip doğru, özellikle serbest bellek hakkında soruyorum.
ConditionRacer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.