Bugünkü yazımda sizlerle; JTAG arayüzü hakkında bilgi vererek, örnek bir IoT saldırısının nasıl yapıldığını sizlerle paylaşacağım. JTAG saldırısına geçmeden önce JTAG’in ne olduğunu iyi kavramamız ve anlamamız gerekiyor. JTAG (Joint Test Action Group), mikro denetleyiciler ve CPLD’ler veya FPGA’lar gibi aygıtları hata ayıklamak ve programlamak için kullanılan bir arabirimdir. Bu arabirim sayesinde, donanımı gerçek zamanlı olarak kolayca donanım içerisindeki kodları takip edebilirsiniz. Yani, yazılım aracılığıyla mikro denetleyiciye sağlanan saat döngülerini doğrudan kontrol edebilir. Bu nedenle, kod yürütme işleminize donanım kesme noktaları koyabilirsiniz. Donanımdaki kodun çalışmasını istediğiniz gibi başlatabilir, duraklatabilir, durdurabilirsiniz.
JTAG kontrolü ‘1’ olarak ayarlandığında, osilatör saati CPU’ya bağlanır, aksi halde CPU saat almaz ve herhangi bir komut yürütemez. Bu şekilde, donanımdaki talimatların yürütülmesini kontrol edebilirsiniz. CPLD / FPGA’ları programlamak için, JTAG bilgisayarın paralel portunu kullanır. Fakat siz mikro denetleyicilerinizi USB bağlantı noktası üzerinden de programlayabilirsiniz.
Üreticiler JTAG’ı Neden Kullanıyor?
JTAG, bilgisayarınızı bir kart üzerindeki yongalarla doğrudan iletişim kurabilmenizi sağlayan yaygın bir donanım arabirimidir. Başlangıçta, baskılı devre kartlarının (PCB’ler) test edilmesindeki artan zorluğa hitap etmek için 80’lerin ortalarında, Joint (European) Test Access Group konsorsiyumu tarafından geliştirilmiştir. JTAG, 1990 yılında Intel 80486 işlemcisine dahil edildiğinden ve aynı yıl IEEE 1491 olarak kodlandığından beri yaygın bir şekilde kullanılmaktadır. Bugün JTAG, hemen hemen tüm gömülü cihazlarda hata ayıklama, programlama ve test için kullanılmaktadır.
Sınır Tarama (Boundary-Scan)
Entegre devrelerin icadı ile fiziksel bağları test etme ihtiyacı ortaya çıktı. Yani: bir devre kartındaki “A Noktası” nın “B Noktası” na doğru bir şekilde bağlanıp bağlanmadığını test edilmesi. Endüstri daha yüksek yoğunluklu ara bağlantılara ve daha ince daha küçük bileşenlere doğru ilerlerken, entegre devrelerin (veya “yongaların”) test edilmesinin standart bir şekilde yapılmasına ihtiyaç duyuldu. Test mantığını IC’nin kendi içine gömerek ve fiziksel arayüzü sadece birkaç sinyale sınırlayarak, JTAG / boundary-scan modern elektronik sistemleri test etmek, hata ayıklamak ve teşhis etmek için bir çözüm sundu. Basitçe belirtirsek, sınır tarama, tek tek yongaları okumanızı ve yazmanızı sağlar. Bu okuma ve yazma 1 ve 0 ‘ JTAG arayüzü, üreticilere bir çip üzerindeki pimler arasındaki fiziksel bağlantıları test etmenin bir yolunu sunar. Çip A üzerindeki çip A’nın çip B’deki B pinine fiziksel olarak bağlandığından ve tüm bu pinlerin düzgün çalışıp çalışmadığı test ediliyor. JTAG, bir cihaza doğrudan donanım erişimi sağladığından, güvenlik araştırması için de harika bir araçtır.
JTAG ile uğraşmayı isteyenler genellikle web sitelerinde size nasıl çalıştığının “teorisini” söyler, ancak “nasıl başlayacağınız” konusunda daha fazla bilgi bulamazsınız. Bu yazımda güvenlik araştırmalarınız için bu arabirimi nasıl kullanacağınızı sizinle paylaşacağım.
Güvenlik Araştırmaları için JTAG ne anlam ifade eder ?
Mühendis ve geliştiricilere entegre devreleri test etmek ve programlamak için kolay erişim sağlamak amacıyla, üreticiler JTAG’ı geliştirdiler. Ancak, kapınıza bir kapı kilidi koyarsanız ve anahtarı paspasın altına bırakırsanız, “bu sırrınız” sadece anahtarı nerede bulacağınız kadar güvendedir. Bu durumda, JTAG saldırganlara krallığın anahtarlarını bulmanın kolay bir yolunu verir. JTAG dünyasına girelim ve bu yararlı geliştirici aracının güvenlik araştırmaları için nasıl kullanılabileceğini hep birlikte görelim.
JTAG Basit Bir Arayüz mü ?
JTAG bir arayüzdür ve bir çipin komut dizelerine nasıl tepki vereceğini bilmez. Bir cihazı JTAG kullanarak tek başına kullanmayı denemek teknik olarak mümkün olabilir, ancak çok zaman alıcı olur ve çipin tüm iç işleyişini ve mimarisini derin ve bütüncül bir şekilde anlamayı gerektirir. JTAG’ın etkili bir araştırma aracı olması için, insan tarafından okunabilir kod ile JTAG TAP denetleyicisine giren ve çıkan düşük düzeydeki yönergeler arasında çeviri yapabilecek bir şeye ihtiyacınız vardır.
Donanım Tabanlı Yazılım hata ayıklama
Geleneksel yazılım hata ayıklama görevleri gerçekleştirmek için donanımı manipüle ediyoruz. Aslında, OpenOCD ile bir GDB sunucusu oluşturarak tanıdık yazılım hata ayıklama araçlarını kullanmanıza olanak veriyor; bu sayede, aygıtlardaki yazılım ve yazılımların GDB, IDA Pro veya GDB istemcisi olarak bize hata ayıklanması olanağını veriyor. Bu tekniğe “Donanım tabanlı Yazılım Hata Ayıklama” diyoruz.
Konfigürasyon Dosyaları
Binlerce farklı yonga mimarisi içerisinde OpenOCD bunların hepsiyle nasıl iletişim kuracağını sizce nasıl biliyor? Basitçe söylemek gerekirse, OpenOCD bu talimatları öğrenmek için özel yapılandırma dosyalarını kullanır. İletişim kurmak istediğiniz çip için doğru yapılandırma dosyasına sahip olmalısınız. En yaygın çip türlerinin çoğuna ait yapılandırma dosyaları OpenOCD ile birlikte gelir ve çoğu diğerleri çevrimiçi olarak kolayca indirilebilir.
Ek Donanım
Çoğu bilgisayar JTAG ile iletişim kurmak için inşa edilmiş gerekli donanıma sahip değildir. Bu Shikra veya BusPirate donanımlarını kolay ve ekonomik şekilde internet üzerinden temin edebilirsiniz. Profesyonel cihazlar daha fazla kontrol ve verimlilik sağlayabilir ve genellikle kendi hata ayıklama yazılımlarını içerebilir, ancak maliyet buna göre artar. OpenOCD kullanıyorsanız, aynı zamanda bu cihazla nasıl iletişim kuracağını öğretecek bir yapılandırma dosyasına da ihtiyaç duyacaksınız. Bilgisayarınız ve JTAG denetleyici arasındaki iletişim genellikle bir seri arabirim üzerinden yapılır.
JTAG ile Örnek Bir IoT Saldırısı
1. Adım : JTAG’ı kullanarak bir cihazın sahibi olmak ne kadar kolay olduğunu göstermek için, hep birlikte bir örnek yapalım. Bunun için bir wireless yönlendiricisi kullanacağız. Üreticiler, uygun kimlik bilgileri verilinceye kadar (admin şifreleri) cihazda herhangi bir komut vermenizi önleyen standart bir giriş kontrol sistemi koyarlar. Bu sistemlerin kimlik bilgileri üretici tarafından gizli tutmaktadır. İlk görevimiz bu cihaza girmek. Giriş istemini hızlı ve kolay bir şekilde atlamak için JTAG’ı kullanacağız ve ardından bir shell root alacağız.
Bu örnekte, bir Shikra’yı bizim JTAG denetleyicimiz ve OpenOCD olarak bir Linux sanal makinesinde çalışan hata ayıklama yazılımı olarak kullanacağız.
- Cihazdaki UART arayüzüne Seri-USB kablosu bağlayın. Bu, donanım bitlerini ayarlarken yönlendiricinin ne yaptığını izlemenizi sağlar.
- Cihazda oturum açma bilgilerine ulaşmak için gücü açıp kapatacağız. Bu, normal kullanıcı arayüzüne UART erişimi sağlar.
- Cihazı kesmek için Shikra’yı JTAG arayüzüne bağlayın. Shikra üzerindeki bir pin, cihazdaki ilgili pime bağlanır. Data-In olan ve Data-Out olan bir pin olup olmadığından emin değilseniz, sadece birini denemek en kolay yoldur ve eğer yanılıyorsanız, bunları tersine çevirin. Shikra’daki JTAG pinouts’larını yukarıdaki şemada görebilirsiniz ve Shikra’nın buraya nasıl bağlanacağı hakkında daha fazla bilgi bulabilirsiniz.
- Shikra’yı bilgisayarınızdaki bir USB bağlantı noktasına bağlayın ve Shikra’daki pimleri fiziksel olarak yönlendiricideki JTAG arabirimine bağlayın.
Cihaza UART bağlantısı yapıldıktan sonra, cihaz açıldığında cihaz açılışını interaktif olarak izleyelim.
Cihaz tamamen açıldıktan sonra bu giriş ekranı ile karşılaşıldığında nasıl bypass edebileceğimizi araştıralım.
Bu giriş ekranını atlatmamıza yardımcı olması için bir JTAG bağlantısından yararlanıp yararlanamayacağımızı göreceğiz! Cihazınızdaki JTAG arayüzünü bulmak zor olabilir. JTAG, cihazın dışına nadiren maruz kalır, bu yüzden muhtemelen dış kasayı açmanız gerekecektir. Modem kasasını açtıktan sonra, bazen bazı pinlerin açık olduğunu göreceksiniz. Normalde üreticiler bunları gizler veya pinleri tamamen kapatır. JTAG pinleri hemen belli değilse, ürün spesifikasyon sayfalarını ve teknik belgeleri inceleyerek bulabilirsiniz. Üreticinin JTAG’ı devre dışı bırakma konusunda gerçekten titiz davranması durumunda, arayüze erişmek için bazen içerisine bir lehim atmak gerekebilir.
2. Adım : Root işlemine başlarken UART bağlantısı ile cihaz ile etkileşime girebiliriz, fakat OpenOCD’yi başlatmak için terminalleri açmaya başlarken UART terminaline de bakmak istiyoruz çünkü bu cihazın herhangi bir hata veya yeniden başlatma yapıp yapmadığını görmemize yardımcı olacaktır.
Yapabileceğimiz ilk şey, wireless yönlendiricisinin çalışmasını duraklatmak için bir durma komutu göndermektir. Maalesef, UART ile izliyorsanız, bir saniye sonra yönlendiricinin yeniden başladığını göreceksiniz. Bunun nedeni, yönlendiricinin Watchdog Timer adlı işletim sisteminin bir özelliğidir. Watchdog, yönlendiricinin belirli bir süre (genellikle saniyenin altında) çalışmayı durdurduğunu fark ederse, yönlendiriciyi otomatik olarak yeniden başlatır.
Bu özellik, durma komutunu vererek, yeniden başlatma işlemini bekleyerek kolayca atlayabilir ve ardından hemen durdurabilir Watchdog zamanlayıcı yükleme şansı olmadan önce tekrar komut vermek gerekir. Önyükleme parametrelerini değiştirmek istediğimizden, önyükleme yükleyicisinin işletim sistemini gerçekten başlatma şansı bulmadan önce ikinci durdurma komutunu verelim.
Yönlendiriciyi durdurduktan sonra, kesme noktalarını ayarlayabilir, işlem boyunca adım atabilir ve cihazdaki belleği denetleyebilir / enjekte edebiliriz.
Wireless yönlendiriciyi rootlamak için, yönlendiriciyi tek kullanıcı moduna ayarlamalıyız ve bellekte önyükleme argümanlarını değiştirmeliyiz. Bunu yapmak için tek yapmamız gereken bir boşluk karakteri ve Wireless yönlendiriciyi için önyükleme seçeneklerinin sonuna 1 numara eklemektir. Önyükleme argümanlarını görüntülemek için Wireless yönlendiricinin firmware yazılımını kullanıyoruz. Vim’i “hex editörüne” dönüştürmek için “xxd” kodunu kullanacağız:
Cihazda çıkarılan firmware yazılımı görüntüsünü kullanarak, önyükleme argümanlarının canlı bellekte nerede olacağına dair artık bir fikrimiz var. Önyükleme argümanlarının, çekirdek açılışından kısa bir süre sonra belleğe açıldıktan sonra büyük olasılıkla olacağını bildiğimiz bir yerde bir gözlem noktası belirleyebiliriz. Bu, sadece bu açma işlemini değil, aynı zamanda çekirdek çizme işleminden önce bu çekirdek argümanlarını okuyan cihazı da gözlemlememizi sağlayacaktır. Bu adreste bir kontrol noktası belirledik ve operasyona devam edeceğiz.
Wireless yönlendirici, önyükleme işlemine devam edecek, ancak izleme noktamızın ayarlandığı bellek adresine dokunduğunda, yürütme tekrar duracaktır. Çekirdek, çekirdek belleğe sıkıştırılırken izleme noktası duraklatıldıktan sonra, önyükleme argümanlarının sonuna bir “<space> 1” (onaltılık olarak temsil edilen bir kısa: 0x2031 olan) eklemek için bir bellek yazımı gerçekleştirebiliriz. İzleme noktasını kaldırabilir ve yönlendiricinin önyüklemeyi bitirmesini sağlayabiliriz.
Kritik üzerine yazma işlemini gerçekleştirmek için bellek ve “mww” (bellek yazma) değerleri dökmek için “mdw” (bellek döküm) komutunu kullanıyoruz. Cihazın önyükleme işlemine devam ettiğini gözlemliyoruz ve şimdi önyükleme dizimizin biraz farklı olduğunu görüyoruz.
JTAG, tasarım, test ve üretim aşamalarında çip üreticileri için son derece yararlı olmak ile birlikte güvenlik araştırmacıları içinde mükemmel bir araçtır. JTAG arayüzünü piyasadaki neredeyse her gömülü sistemde bulabilirsiniz. Ancak, gösterdiğim gibi, JTAG ayrıca büyük bir potansiyel saldırı vektörünü temsil etmektedir. Üreticiler bu riskin farkındadır ve JTAG arayüzlerine erişimi engellemek için JTAG izlerini gizlemeye veya hatta tamamen kesmeye çalışarak güvenlik önlemleri almaktadırlar. Bu yöntemler biraz etkilidir ve caydırıcıdır fakat bir havya ile yetenekli olan bir saldırgan neredeyse her zaman cihazın içerisine erişebilir. JTAG standardına şifreleme ve kriptografik kimlik doğrulaması eklemek için birkaç farklı standart önerilmiştir, ancak bunlar henüz kodlanmamıştır.