연구자: 명지대학교 정보통신공학과 4학년 이종윤
DBREACH_-압축-사이드-채널을-이용한-데이터베이스-공격.pdf
직접 docker 환경으로 구성해본 실습환경
https://github.com/jongcoding/compression-side
개요: 코드는 압축 사이드채널 취약점을 이용하여 secret(비밀)과 attacker-controlled guess(추측) 간의 중복 정도에 따른 압축 효과를 측정하고, 여러 후보(총 n개 중 k개를 선택하는 k-of-n 전략)를 통해 정답을 추론하는 실험 코드
핵심 아이디어: **“비밀과 guess가 겹치면 압축률이 높아져 전체 데이터 크기가 줄어든다”**는 점을 이용하는 것
압축의 원리:
압축 알고리즘은 중복되는 데이터나 패턴을 효율적으로 줄인다. 만약 guess 문자열이 실제 secret의 일부와 겹친다면, 데이터 전체의 압축률이 높아지고 결과적으로 저장된 파일(혹은 테이블)의 크기가 줄어든다.
공격 시나리오:
docker.compose.yml
version: '3.8'
services:
mariadb:
image: mariadb:10.3.29
container_name: mariadb_container
restart: unless-stopped
environment:
- MARIADB_ROOT_PASSWORD=your_root_password # 루트 계정 비밀번호
- MARIADB_DATABASE=flask_db # 자동 생성할 DB
- MARIADB_USER=flask_user # 자동 생성할 사용자
- MARIADB_PASSWORD=flask_pass # 자동 생성할 사용자의 비밀번호
volumes:
# 1) my.cnf (압축/암호화 설정 포함)
- ./mariadb/my.cnf:/etc/mysql/my.cnf
# 2) DB 데이터 영구 저장 볼륨
- mariadb_data:/var/lib/mysql
# 3) File Key Management 키 파일 (읽기 전용 권장)
- ./mariadb/encryption/keyfile:/etc/mysql/encryption/keyfile:ro
ports:
- "3307:3306"
mongo:
image: mongo:6.0
container_name: mongo_container
restart: unless-stopped
environment:
- MONGO_INITDB_ROOT_USERNAME=mongo_root
- MONGO_INITDB_ROOT_PASSWORD=mongo_root_password
volumes:
- mongo_data:/data/db
ports:
- "27017:27017"
flask:
build:
context: ./flask
dockerfile: Dockerfile
container_name: flask_container
restart: unless-stopped
depends_on:
- mariadb
- mongo
ports:
- "5000:5000"
environment:
# Flask 앱에서 DB 연결 시 참고할 환경변수
- DB_HOST=mariadb_container
- DB_USER=flask_user
- DB_PASSWORD=flask_pass
- DB_NAME=flask_db
- MONGO_HOST=mongo_container
- MONGO_USER=mongo_root
- MONGO_PASS=mongo_root_password
volumes:
mariadb_data:
mongo_data:
my.cnf
[mysqld]
user = mysql
pid-file = /run/mysqld/mysqld.pid
socket = /run/mysqld/mysqld.sock
datadir = /var/lib/mysql
tmpdir = /tmp
bind-address = 0.0.0.0
log_error = /var/log/mysql/error.log
# 문자셋 (현재 ascii, 필요시 utf8mb4로 변경 가능)
character-set-server = ascii
collation-server = ascii_general_ci
# InnoDB 압축 설정
innodb_file_per_table = 1
innodb_file_format = Barracuda
innodb_default_row_format = dynamica
innodb_compression_algorithm= zlib # zlib, lz4, snappy 등
innodb_compression_default = ON
innodb_compression_level = 6
# InnoDB 암호화
innodb_encrypt_tables = ON
innodb_encrypt_log = ON
# 임시 테이블 암호화
encrypt_tmp_disk_tables = ON
encrypt_tmp_files = ON
# encrypt_tmp_sort_files=ON <-- 10.3 버전에서 미지원이므로 제거
# Aria 테이블 암호화
aria_encrypt_tables = ON
# file_key_management 플러그인 (키 파일 경로 예시)
plugin_load_add = file_key_management
loose_file_key_management_filename = /etc/mysql/encryption/keyfile
loose_file_key_management_encryption_algorithm = AES_CTR
# (추가로 필요한 플러그인)
plugin_load_add = ha_archive
plugin_load_add = ha_rocksdb
[mariadb]
[mariadb-10.3]