Mehmet Karahan
4 min readApr 15, 2023

Docker Güvenliği 3 — Yapılandırma Hataları-1

Yazımda Docker’ın hatalı yapılandırmalarından kaynaklanabilecek olası güvenlik riskleri ve hatalı/eksik yapılandırma sonucunda ortaya çıkabilecek zafiyetlerden bahsedeceğim.

a. Docker Yetkileri

Docker servisi (Daemon — Windows işlem sisteminde servise karşılık geliyor denilebilir) “root” yetkileriyle çalıştığından kullanıcı host makinenin dizinini container’a bağlarsa, container üzerinden host makinenin dizinlerine “root” yetkileriyle erişilebilir. Bu durumdan kaynaklı yetkisiz kullanıcıların Docker’a erişebilmesine neden olan bazı durumlar vardır. Bu başlık altında bu durumları inceleyeceğim.

  1. docker Grubu

“sudo” yetkilerine sahip olmasa bile “docker” grubunda bulunan kullanıcı/kullanıcılar sistemdeki tüm dosyalara erişebilir.

Aşağıdaki ekran görüntülerinde “docker” grubunda bulunan “kali” kullanıcısı “/etc/shadow” dizininde bulunan parola hashine erişebilmektedir.

Yalnızca ihtiyacı bulunan kullanıcıların “docker” kullanıcı grubuna eklenmesi gerekmektedir.

2. Tüm Kullanıcıların Okuma ve Yazma Yetkisi Bulunan “docker.sock”

Varsayılan olarak, Docker soketine yalnızca root ve docker grubundaki kullanıcıların Docker’a erişimi vardır. Ancak bazı durumlarda hatalı olarak tüm kullanıcılara Docker servisi için okuma ve yazma izni verilebilmektedir.

Aşağıdaki ekran görüntülerinde “docker.sock” için tüm kullanıcılara okuma ve yazma yetkisi verilmiş bir senaryo örneğinde “/etc/shadow” dizininde bulunan parola hashine erişebilmesine dair durum gösterilmiştir.

3. setuid Bit
docker (/usr/bin/docker) dosyası için setuid biti ayarlanarak sistem yanlış yapılandırılırsa, bir kullanıcı Docker’ı root (/usr/bin/docker dosyasının sahibi) olarak çalıştırabilir.

“docker” grubuna dahil olunmamasına rağmen ancak setuid biti ayarlandığı için docker’ın çalıştırılabilmesine ilişkin senaryoya dair ekran görüntüleri aşağıda verilmiştir.

b. Okunabilir Konfigürasyon Dosyaları

Docker yapılandırma dosyaları hassas bilgiler içerebilir. Bu dosyalardaki izinler yanlış yapılandırılmış ise dosyaları okuyamaması gereken kullanıcılar okuyabilir ve hassas bilgilere erişilebilir.

Hassas bilgiler içerebilecek iki yaygın dosya “.docker /config.json” ve docker-compose.yaml’dir.

  1. .docker/config.json

Kullanıcıların kendilerini doğrulamak için kayıt defterinde oturum açmaları gerekir. imaj yüklerken veya indirilirken her seferinde bu bilgileri girmemek için bu kimlik bilgileri önbelleğe alınır. Bunlar, varsayılan olarak kullanıcının ana dizininde Base64 kodlamasında saklanır.

Bunlar, varsayılan olarak kullanıcının ana dizininde Base64 kodlamasında saklanır. Dosyaya erişimi olan bir saldırgan, oturum açmak ve kötü amaçlı Docker görüntülerini yüklemek için ele geçirdiği kimlik bilgilerini kullanabilir.

2. docker-compose.yaml

“docker-compose.yaml” dosyaları genellikle hassas bilgiler içerir (parola ve API anahtarları vb. gibi), bir container’a iletilmesi gereken tüm bilgiler “docker-compose.yaml” dosyasına kaydedilir.

c. Docker Socket (/var/run/docker.sock)

Docker socket istemcilerin Docker servisi ile iletişim kurma yoludur. Kullanıcı bir Docker istemci komutunu çalıştırdığında, Docker istemcisi sokete bir HTTP isteği gönderir, kullanıcı HTTP isteklerini doğrudan sokete gönderebilir.

Bu riski ortadan kaldırmak adına Docker soket dosyası sahipliğinin “root:docker” olarak ayarlandığından emin olunmalı ve Docker soket dosyası izinlerinin 660 veya daha düşük yetkiler ile sınırlandırılması gerekmektedir.

Docker servisi ile Docker istemcisi ve soket ile doğrudan etkileşime dair örnek ekran görüntüleri:

Docker istemcisi üzerinden etkileşim
Docker socket üzerinden doğrudan etkileşim
  1. Docker Soketini Kullanarak Ana Makine Üzerinde Komut Çalıştırma

“ /var/run/docker.sock” bir birim olarak bağlanırsa, container’ın docker API’a erişimi olur. Bu durum container’ın ana bilgisayardaki Docker’a tam erişimi olduğu anlamına gelir.

Ana bilgisayarda “admin” adlı bir kullanıcının şifre haşini almak istediğimizi varsayalım.

Aşağıdaki ekran görüntülerinde çalıştırılan komutların, “/var/run/docker.sock’un” bir birim olarak bağlandığı bir containerda çalıştırılması yeterli olacaktır.

API’yi, ana makinede “/etc/shadow” dosyasına erişimi olan başka bir Docker container başlatmak için kullanırız. Yeni başlatılan container’ın loglarına bakarak parolaların hashli halinin bulunduğu “/etc/shadow” dosyası okunabilir.

Ana makinede “/etc/shadow” dosyasına erişimi olan bir container başlatılması
Container loglarından “/etc/shadow” içeriğinin okunması

2. Hassas Bilgilere Erişim

Container /var/run/docker.sock dosyasına eriştiğinde mevcut containerların konfigürasyonlarını da görüntüleyebilir. Konfigürasyon dosyaları hassas bilgiler içerebilir

Bir Docker içinde bir Postgres veritabanı başlatalım. “POSTGRES_PASSWORD” ortam değişkeni kullanarak bir parola belirlenebilir.

Docker API’a erişimi olan başka bir containera erişim mevcutsa parola ortam değişkeninden okunabilir.

“POSTGRES_PASSWORD” ortam değişkeni ile parola belirlenerek bir veritabanı başlatılması
Farklı bir Container’ın ayağa kaldırılması ve Web API JSON verileri için curl jq yüklenmesi
Ayağa kaldırılan Container’dan ortam değişkeni içerisinde “POSTGRES_PASSWORD” değerinin okunması

3. Uzaktan Erişime İzin Verilmesi

Docker API’sinin bir TCP portundan dinlenmesi de sağlanabilir. 2375 (HTTP) ve 2376 (HTTPS) numaralı bağlantı noktaları genellikle Docker API’sinin HTTP ve HTTPS iletişimi için kullanılır. Bu port yalnızca localhosttan dinleyecek şekilde yapılandırılmamışsa ağdaki her ana bilgisayarın Docker’a erişimini sağlar. Ana bilgisayara da doğrudan internet üzerinden erişilebiliyorsa, ana bilgisayardaki Docker’ın tüm özelliklerine herkesin erişmesine izin verir. Saldırgan bu hatalı yapılandırmadan faydanalanarak containerın ve temel altyapının daha fazla tehlikeye girmesine yol açabilecek başka containerlar başlatabilir.

Mehmet Karahan
Mehmet Karahan

Written by Mehmet Karahan

Sızma testi ve siber güvenlik alanında yaptığım çalışmalarla ilgili yazılarımı paylaşıyorum