한 줄 요약:
Build Time이 아닌 Runtime때 발생한 침투인것 같다고 생각.
파일 업로드, nginx쪽 보안 강화함.
readonly로 컨테이너 올리면
예상 시나리오를 막을 수 있다
상황:
운영 중인 사이트가 다음과 같은 케이스로 진입시 리다이렉트 되며 특정 도박(?) 사이트로 진입한다.
1) PC로 구글링하여 진입시 -> CSS만 깨짐
2) 모바일폰으로 구글링하여 진입시 -> 아래 주소로 리다이렉트됨
https://456wincc.mm456win.com
해커가 관리자는 파악 못하도록 모바일만 리다이렉트 처리하도록 한 거 같다.
원인파악)
1) nginx의 conf 파일 문제없음
2) 프론트 컨테이너 내부 파일 소스 확인
-> 여기서 Titan, dd라는 파일이 루트 디렉토리에 있었음

당시 vi로만 확인하고 정확한 소스를 기록을 못함.
Titan은 javascript소스 였고 ddd는 디코딩이 안되어 문자를 읽을 수 없었음.
3) 빌드는 최근에 한 적 없어서 빌드타임 때 라이브러리 취약점으로 인해 발생한것 같지 않음
4) ssh 침투 흔적 없어보임(그래도 보안 강화함..)
결국에는 Build Time이 아닌 Runtime때 발생한 침투인것 같다고 생각함.
파일 업로드, nginx쪽 보안 강화함
[해결시도]
Titan, ddd 파일이 있는 컨테이너만 재시작하니 이상이 없었다.
그러나 파일 자체가 투입된거는 백도어가 있다라고 판단이 되어 서버 자체에 보안을 심화시켜야 된다고 생각해 실행.
1. 성공한 로그기록 확인
last | head -20
모두 내 계정이라 SSH로 직접 접근 한 건 아닌 것 같음
2. 의존하고 있는 패키지 중 하나가 해킹 당해 내 프로젝트 까지 영향을 미친 것.
# --- Build stage ---
FROM node:22-alpine AS builder
WORKDIR /app
# 1) lockfile 기준으로 의존성 고정
COPY package.json package-lock.json ./
RUN npm ci --ignore-scripts
# 2) 소스 복사 후 빌드
COPY . .
RUN npm run build
# --- Run stage ---
FROM node:22-alpine
WORKDIR /app
# non-root 유저
RUN addgroup -S app && adduser -S app -G app
USER app
# 런타임에 필요한 것만 복사
COPY --from=builder /app/package.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
ENV NODE_ENV=production
EXPOSE 3000
CMD ["npx", "next", "start", "-p", "3000"]
3. 최근에 빌드한 적이 없는데 컨테이너 내에 파일이 추가된 것임. 빌드타임 때 해킹 당한게 아니라
RCE (Remote Code Execution)를 당했을 가능성이 높다.
RCE를 통해 SEO 클로킹/JS 인젝션 한 가능성이 높다.
따라서 아래 내용을 진행함
- 컨테이너 올릴 때 read-only
- 컨테이너 파일시스템 사용할 수 있는 디렉토리 제한
- nginx 설정파일 수정
- client_max_body_size
- header size 제한
- 비정상 path 차단
[front 컨테이너]
docker run -d \
--read-only \
--tmpfs /tmp \
--cap-drop ALL \
-p 3000:3000 \
front-image
[back 컨테이너]
docker run -d \
--read-only \
--tmpfs /tmp \
--cap-drop ALL \
-p $PORT:$PORT \
--network $NETWORK \
-v $(pwd)/uploads:/uploads:rw \
--name $CONTAINER_NAME \
$IMAGE_NAME
공격자가 침투한 예상 경로
[외부 공격자]
↓
Spring 파일 업로드 API 발견
↓
파일명에 ../ 포함한 악성 업로드
↓
Spring 컨테이너에서 임의 파일 생성
↓
Docker 네트워크 통해 프론트 컨테이너 접근
↓
프론트 런타임 JS 변조 + Titan 드롭
↓
모바일 + 구글 조건부 리다이렉트
1. 스프링 컨테이너에 업로드시에 Node 스크립트를 주입
2. 아래와 같은 코드로 진행했을 거라고 예상
curl http://localhost:3000
# 어 컨테이너 있다
fs.writeFileSync("Titan", payload)
# 파일 심기
따라서 readonly로 컨테이너 올리면
예상 시나리오를 막을 수 있다
'서버' 카테고리의 다른 글
| mac - ssh key 추가 및 공개키 등록하기(mac, window) (0) | 2025.12.26 |
|---|---|
| mac - docker access token으로 로그인하기 (0) | 2025.12.26 |
| docker) docker hub에 이미지 올리고 풀 받기 (0) | 2025.12.07 |
| mac - node, nvm 설치 (0) | 2025.11.02 |
| mac - brew 설치 (0) | 2025.11.02 |