IDE 확장 프로그램이 클라우드에 보내는 내용을 감사하는 방법
Source: Dev.to
아무도 경고하지 않는 문제
지난달에 새로운 AI 코딩 어시스턴트를 설치했습니다. 일주일도 안 되어 노트북 팬이 계속 돌아가고, 배터리 소모가 두 배가 되었으며, 도구를 사용하고 있지 않을 때조차 네트워크 활동이 이상하게 급증하는 것을 발견했습니다.
뭐가 전송되고 있는지 궁금해졌습니다.
IDE 확장 프로그램, CLI 도구, 혹은 편리하게 보이는 “도우미” 에이전트가 편집기에 마법처럼 통합돼 있다면, 이 글이 바로 당신을 위한 것입니다. 저는 이와 같은 문제를 세 프로젝트에서 디버깅해 왔으며, 도구들을 직접 사용해 보면 생각보다 접근하기 쉽습니다.
불편한 진실 하나: IDE 확장 프로그램은 보통 편집기 프로세스와 동일한 권한으로 실행됩니다. 즉, 다음을 할 수 있다는 뜻이죠.
- 열려 있는 워크스페이스(그리고 종종 그 밖)의 모든 파일을 읽을 수 있다
- 임의의 외부 HTTPS 연결을 만들 수 있다
- 서브프로세스를 생성할 수 있다
- 환경 변수에 접근할 수 있다(예:
AWS_SECRET_ACCESS_KEY) - 파일 시스템 변화를 감시할 수 있다
프라이버시 정책은 벤더가 수집하려는 내용을 알려줄 뿐, 현재 내 컴퓨터에서 실제로 무엇이 나가고 있는지는 알려주지 않습니다. 그리고 대부분이 HTTPS이기 때문에 단순히 tcpdump만으로는 확인할 수 없습니다.
가시성 격차의 근본 원인은 TLS입니다. 암호화된 트래픽은 엔드포인트 중 하나를 제어하지 않는 한 잡음처럼 보이며, 대부분의 네트워크 모니터는 연결 메타데이터까지만 보여줍니다.
먼저 살펴보기
macOS 혹은 Linux에서는 lsof를 사용해 현재 열려 있는 네트워크 연결을 확인할 수 있습니다.
# 이름으로 특정 프로세스의 모든 네트워크 연결을 리스트
lsof -i -P -n | grep -i 'code\|cursor\|node'
# PID를 알고 있다면 이렇게
lsof -p 12345 -i -P -n
Linux에서는 ss가 netstat보다 빠르고 최신입니다.
# 소유 프로세스와 함께 TCP/UDP 소켓을 보여줌
ss -tunap | grep
이 명령으로 확장 프로그램이 연결하는 호스트명과 포트를 알 수 있습니다. 보통 CDN 엔드포인트, 텔레메트리 엔드포인트, 실제 API가 보이게 되죠. 이 자체만으로도 유용합니다—생소한 도메인에 연결된다면 그건 조사해 볼 만한 단서입니다.
텔레메트리 서버(telemetry.example.com)에 연결된다고 해서 어떤 데이터를 보내는지는 알 수 없습니다. 페이로드를 보려면 명시적으로 신뢰하는 중간자 프록시가 필요합니다.
mitmproxy: 사실상의 표준
mitmproxy는 무료이며 오픈 소스, 파이썬 스크립팅이 가능합니다.
# 전역 파이썬을 오염시키지 않도록 pipx로 설치
pipx install mitmproxy
# 포트 8080에서 인터랙티브 TUI 시작
mitmproxy --listen-port 8080
트래픽을 프록시로 보내는 방법
두 가지 접근법을 사용했습니다.
방법 A — HTTP_PROXY 환경 변수
Node 기반 확장은 보통 이 변수를 따릅니다.
# 프록시 변수를 설정하고 편집기 실행
HTTPS_PROXY=http://127.0.0.1:8080 \
HTTP_PROXY=http://127.0.0.1:8080 \
NODE_EXTRA_CA_CERTS=~/.mitmproxy/mitmproxy-ca-cert.pem \
/Applications/YourEditor.app/Contents/MacOS/YourEditor
NODE_EXTRA_CA_CERTS 옵션이 중요합니다. mitmproxy CA를 신뢰하지 않으면 Node가 가로채진 인증서를 거부하고 확장 프로그램이 조용히 실패하거나 알 수 없는 방식으로 폴백합니다.
방법 B — 시스템 전역 프록시
확장이 환경 변수를 무시한다면(많은 경우 그렇습니다) OS 수준에서 프록시를 설정하고 mitmproxy 루트 인증서를 시스템 신뢰 저장소에 추가합니다. macOS 예시:
# mitmproxy CA를 시스템 키체인에 추가하고 신뢰하도록 설정
sudo security add-trusted-cert -d -r trustRoot \
-k /Library/Keychains/System.keychain \
~/.mitmproxy/mitmproxy-ca-cert.pem
이 작업은 버려도 되는 머신이나 VM에서만 수행하세요. 모든 도메인에 대해 인증서를 서명할 수 있는 CA를 추가하는 것이므로, 감사가 끝나면 반드시 되돌려야 합니다.
요청 내용 보기
프록시를 통해 트래픽이 흐르면 요청이 실시간으로 보입니다. 보통 관심을 가질 만한 것은 벤더가 제공하는 수집 엔드포인트로 향하는 POST 요청입니다. 아래는 요청 본문을 파일로 저장하는 간단한 mitmproxy 스크립트입니다.
# dump_bodies.py — 모든 요청 본문을 타임스탬프 파일로 저장
import time
import pathlib
OUT = pathlib.Path("/tmp/proxy-dump")
OUT.mkdir(exist_ok=True)
def request(flow):
# GET 요청과 빈 본문은 노이즈 감소를 위해 건너뜀
if flow.request.method == "GET" or not flow.request.content:
return
ts = int(time.time() * 1000)
host = flow.request.pretty_host.replace("/", "_")
path = OUT / f"{ts}_{host}.bin"
path.write_bytes(flow.request.content)
다음과 같이 실행합니다.
mitmdump -s dump_bodies.py --listen-port 8080
그 뒤 /tmp/proxy-dump에 생성된 파일들을 열어보세요. 여기서 찾고 싶은 것은 워크스페이스 밖 파일 경로, 환경 변수 이름, 우연히 공유된 코드 조각, .env 파일 내용, 내부 서비스 호스트명 등입니다.
지난 분기에 인기 있는 확장 프로그램을 대상으로 실행했을 때, 매 키 입력마다 워크스페이스 메타데이터가 대량으로 전송되는 것을 확인했습니다. 파일 내용 자체는 아니지만, 디렉터리 구조를 거의 복원할 수 있을 정도의 구조적 정보가 포함돼 있었습니다.
파일 시스템 활동도 살펴보기
네트워크 트래픽만이 전부는 아닙니다. 확장은 로컬에 캐시를 저장하거나, 홈 디렉터리에 파일을 쓰거나, 예상치 못한 곳에 자격 증명을 남길 수 있습니다. macOS에서는 fs_usage, Linux에서는 inotifywait을 사용합니다.
# macOS: 특정 프로세스의 모든 파일 시스템 활동 감시
sudo fs_usage -w -f filesys | grep
# Linux: 홈 디렉터리를 재귀적으로 감시
inotifywait -mr ~ --format '%w%f %e' 2>/dev/null
출력이 많으니 필터링을 적극적으로 적용하세요. 그래도 확장이 ~/.cache/…에 텔레메트리 블롭을 쓰는 등 눈에 띄지 않는 동작을 포착할 수 있습니다.
내가 실제로 도움이 된 습관들
-
설치 전에 감사하기
깨끗한 VM을 띄우고 확장을 설치한 뒤 위 과정을 한 시간 정도 실행합니다. 트래픽이 이상하면 실제 워크플로에 적용하기 전에 알 수 있습니다. -
프로젝트별 워크스페이스 격리
비밀이 포함된 모노레포를 스케치 같은 확장과 같은 편집기 세션에 열지 마세요. 신뢰 경계는 내 허용 수준에 맞춰야 합니다. -
.env파일 감시
대부분의 확장은 이를 제외한다고 주장하지만, 가짜.env에 캔너리 문자열을 넣고 트래픽에서 검색해 확인하세요. -
확장 버전 고정
업데이트는 행동을 급격히 바꿀 수 있습니다. 감사한 버전(예: 1.4.2)을 잠그고, 버전 올리기 전 다시 감사합니다. -
베이스라인 유지
첫 주에 확장이 연락하는 엔드포인트 목록을 저장해 두세요. 6주 차에 새로운 도메인이 나타난다면 조사할 신호가 됩니다.
에디터에