Flash 0-day Açığı Nedir?

Bu yazıyı anlamak için biraz progrmalama ve matematik bilmeniz gerek, fakat olabildiğince sade yazacağım…

Korkmayın, bir açıktan bahsediyorum ama bu sayfada sizi ya da sisteminizi etkileyecek hiçbir öğe yok, izci sözü…

Adobe Flash’in bayt dizi değişkeni (ByteArray)1↗http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/ByteArray.html tanımlamasında bir hata var.

Örneğin bir bayt dizi değişkeni oluşturalım:

var bdd:ByteArray = new ByteArray();
 bdd.length = 8;
 bdd[1] = 1;

Şimdi bdd[] içindeki değerlere erişip bdd[]’ye sayı olarak bayt değerleri atayabiliriz. Aynı zamanda bu dizi değişkene nesneler de atayabiliriz.

Örneğin:

var obj = new MyClass();
bdd[0] = obj;

Action Script 3 yorumlayıcısı MyClass adını verdiğimiz nesneyi MyClass.valueOf() metodunu çalıştırarak değişkeni sayıya çevirmeye zorlar.

Ancak, bu metod tekrar tanımlanarak değiştirilebilir:

Örneğin:

 class MyClass{
    prototype.valueOf = function(){
      bdd.length = 88; // bdd[] bellek alanını tekrar elde ediyoruz
      return 0; // return byte for ba[offset]
   }
}

Yani,

Program kodu içinde değişkene atanan değerin bir nesne, bir sayı gibi değişkenler olabileceği gibi bir bayt dizisi de olabilir.

Kod içinde bir değişkenin uzunluğunu değiştirmek mümkün.

Aynı zamanda değişkeni herhangi bir değere sahipmiş gibi göstermek de mümkün.

Bu kodu yorumlayan AS3 şöyle davranıyor:

Değişkenin numerik değerini valueOf() metoduyla 0 olarak döndürdüğümüzde yorumlayıcı değişken 0 olarak kabul ediyor.

Fakat değişkenin uzunluğunu değiştirdiğimizde o değişken için bellekteki alanı koruyor ve istediğimiz kadar yeni alan açıyor.

Değişkenin işaretçisi bellekteki ofsetini gösteriyor.

 

Bu bayt dizisi haliyle bir çalıştırılabilir program da olabilir.

Burada bu işaretçinin gösterdiği değeri değiştirip 2. bir kodla o alana yazılan bayt dizisini çalıştırmak mümkün.

 

Gelelim bu hatayı nasıl kullandıklarına:

  1. Flash kodu oyun vs’dir
  2. Kod içinde bir linkten program vs indiren bir kod vardır.
  3. Bu program indirilip bellekte tutulur
  4. Yukarıdaki örnekteki gibi bir kodla değişken değeri sıfırlanır,
  5. Değişkenin boyutu inidirlen kodun bayt boyutu olarak değiştirilir
  6. Değişken işaretçisi ele geçirilir
  7. İşaretçinin gösterdiği bellek ofsetine program kodu yazılır
  8. İşaretçinin bellek ofsetindeki kod çalıştırılır

Oluşan sonuç; Flash çalışmaya devam ederken artık arka planda istenilen işlemi yapan bir program çalışmktadır!

İşte HackingTeam bu basit hatayı sömürerek milyonlarca Euro para kazandı!

Yorumlar

comments

   [ + ]

Yorum Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yorum onaylama sistemi etkin; yorumunuzun yayınlanması biraz zaman alabilir.

Translate »

T. Koray Peksayar Blog is Stephen Fry proof thanks to caching by WP Super Cache