Showing Posts From
없는
- 03 Dec, 2025
취약점을 못 찾으면 '없는 건지, 못 찾은 건지' 자책하는 밤
취약점을 못 찾으면 '없는 건지, 못 찾은 건지' 자책하는 밤 오후 3시, 스캔 시작 신규 결제 API 테스트 들어갔다. 개발팀이 자신 있다고 했다. "이번엔 보안 완벽하게 했습니다." 그 말 들으면 더 의심스럽다. Burp Suite 켰다. Proxy 설정하고 트래픽 캡처 시작. 일단 자동 스캔 돌려놨다. 커피 한 잔 마시러 갔다. 돌아와서 결과 확인. Low 몇 개. Medium 하나. 다 거짓 양성이다. 수동 테스트 시작했다. Authorization 헤더 빼봤다. 정상 처리됐다. 이상하다. 토큰 변조해봤다. 401 에러 떴다. 정상이다. SQL Injection 시도. Single quote, double quote, comment. 다 필터링됐다.XSS 테스트 들어갔다. Script 태그, event handler, encoded payload. 전부 sanitize됐다. 깔끔하다. 너무 깔끔하다. 이게 맞나. 오후 5시 됐다. 취약점 없다. 하나도. 6시, 퇴근 시간 동료들 하나씩 퇴근한다. "오늘 뭐 찾았어?" 물어본다. "아직요." 대답했다. "괜찮아, 없으면 없는 거지." 웃으면서 말한다. 없으면 없는 거. 그게 그렇게 간단하지 않다. 보안 QA 6년 차다. 취약점 못 찾는 날이 제일 불안하다. 찾으면 보람 있다. 회사 지켰다는 기분. 못 찾으면 모르겠다. 정말 안전한 건지, 내가 못 찾은 건지. 개발자들은 취약점 없으면 좋아한다. 당연하다. 수정할 거 없으니까. 나는 불안하다. 뭔가 놓친 것 같다. 리포트에 뭐라고 쓸까. "취약점이 발견되지 않았습니다." 이 한 줄. 허전하다. 믿을 수 있을까. 나도 확신 없는데. 여자친구한테 문자 왔다. "저녁 먹자." 답장 보냈다. "조금만 더." 남았다. 혼자. 8시, 다시 시작 처음부터 다시 봤다. 놓친 엔드포인트 있을 수 있다. API 문서 다시 읽었다. 15개 엔드포인트. 다 테스트했다. Rate limiting 확인했다. 잘 걸려 있다. 1분에 100 요청. Brute force 막힌다. IDOR 테스트했다. user_id 변조. 403 에러. 정상이다.SSRF 시도했다. 내부 IP 호출. 막혔다. XXE 테스트. XML 파싱 안 쓴다. GraphQL injection. GraphQL 안 쓴다. NoSQL injection. MongoDB 쿼리 검증 됐다. 2시간 더 지났다. 여전히 없다. 동료한테 물어볼까 생각했다. "내가 놓친 거 있을까요?" 부끄럽다. 6년 차가 이런 질문. 10시, 자책 시작 컴퓨터 앞에 앉아 있다. 화면만 본다. 뭘 더 해야 할까. OWASP Top 10 다시 확인했다. Injection. 확인했다. Broken Authentication. 확인했다. Sensitive Data Exposure. 암호화 됐다. XML External Entities. 안 쓴다. Broken Access Control. 확인했다. Security Misconfiguration. 기본 설정 변경됐다. XSS. 확인했다. Insecure Deserialization. 안 쓴다. Using Components with Known Vulnerabilities. 버전 다 최신이다. Insufficient Logging. 로깅 잘 된다. 다 확인했다. 그래도 불안하다. 작년 생각났다. 3일 동안 못 찾았던 API. "안전합니다" 리포트 올렸다. 2주 후에 버그바운티 해커가 찾았다. JWT 알고리즘 혼동 취약점. 'none' 알고리즘 허용했었다. 나는 못 봤다. 팀장 불렀다. "이거 왜 못 찾았어?" 할 말 없었다. "죄송합니다." 그것뿐이었다. 기본적인 건데. 6년 차가 놓쳤다. 그 이후로 더 신경 쓴다. 그래도 여전히 놓칠까 봐 무섭다. 11시, 마지막 시도 JWT 다시 봤다. 알고리즘 확인. RS256. 고정됐다. 'none' 안 된다. 서명 검증 잘 된다. Expiration 확인. 1시간. 적절하다. Refresh token 로직. 정상이다. Race condition 테스트했다. 동시에 100개 요청. 처리 잘 된다. 중복 안 생긴다. Business logic 봤다. 포인트 적립 로직. 음수 입력. 거부됐다. 환불 로직. 금액 확인 잘 된다. 쿠폰 중복 사용. 막혔다.File upload 기능 없다. CSRF 토큰 잘 된다. Clickjacking X-Frame-Options 설정됐다. CORS 정책 엄격하다. 자정 됐다. 9시간 봤다. 없다. 진짜 없는 건가. 아니면 내가 못 보는 건가. 자정, 집으로 퇴근했다. 사무실 나왔다. 차가운 바람. 12월이다. 택시 탔다. 창밖 본다. 불 켜진 건물들. 저기도 누군가 일한다. 보안 QA만 이럴까. 아니겠지. 여자친구한테 전화 왔다. "아직도 일해?" 목소리 졸리다. "퇴근했어. 미안." 걱정한다. "너무 늦게까지 하지 마." 설명 못 한다. 이 불안감. 취약점 찾으면 일 잘했다는 거다. 못 찾으면 모른다. 일을 잘한 건지, 못한 건지. 개발자는 다르다. 기능 만들면 된다. 동작하면 성공이다. 보안 QA는 애매하다. 안전하다는 걸 어떻게 증명하나. '취약점이 없다'는 증명은 없다. '찾지 못했다'는 것뿐이다. 새벽 1시, 침대에서 누웠다. 잠 안 온다. 핸드폰 켰다. 보안 뉴스 본다. 새로운 CVE 나왔다. npm 패키지 취약점. 우리 프로젝트에 있나 확인해야겠다. 생각이 꼬리를 문다. 오늘 테스트한 API. 진짜 안전할까. JWT 서명 검증 로직 직접 봤나. 소스 코드 확인 안 했다. 블랙박스로만 봤다. 내일 개발팀한테 물어봐야겠다. "JWT 라이브러리 뭐 쓰세요?" 혹시 오래된 버전. 알려진 취약점 있을 수 있다. 근데 그것도 찾으면 찾는 거고. 못 찾으면 모른다. 버그바운티 해커들 생각난다. 걔네는 어떻게 찾을까. 나보다 잘 찾는다. 돈도 번다. 나는 월급 받으면서 못 찾는다. 작년 그 해커. LinkedIn 찾아봤다. 19살이었다. 나보다 어리다. 실력은 훨씬 좋다. 질투 나는 건 아니다. 그냥 자괴감. 이 일 6년 했는데. 19살한테 진다. 새벽 2시, 검색 일어나서 노트북 켰다. JWT 취약점 검색했다. Algorithm confusion, Key confusion, KID injection, JKU/X5U claim abuse. 다 아는 거다. 다 테스트했다. 그래도 뭔가 놓친 것 같다. Stack Overflow 봤다. "How to test JWT properly." 답변 읽었다. 내가 하는 거랑 똑같다. YouTube 켰다. "Advanced JWT attacks." 40분짜리 영상. 봤다. 새로운 거 없다. 다 아는 내용이다. 그래도 불안하다. 문제는 이거다. 내가 아는 방법으로만 테스트한다. 모르는 취약점은 못 찾는다. 당연한 거다. 근데 받아들이기 힘들다. 보안팀장이 말했다. "완벽한 보안은 없어. 최선을 다하면 돼." 위로가 안 된다. 최선이 뭔데. 어디까지가 최선인가. 9시간 테스트했다. 최선이다. 근데 충분한가. 새벽 3시, 포기 노트북 껐다. 누웠다. 천장 본다. 어둡다. 내일 리포트 써야 한다. "신규 결제 API 보안 테스트 결과, 주요 취약점이 발견되지 않았습니다. 인증, 인가, 입력 검증, 에러 처리 등 전반적인 보안 구현이 양호합니다." 이렇게 쓸 거다. 사실이다. 발견되지 않았다. 없다고 안 했다. 발견되지 않았다. 개발팀은 좋아할 거다. "보안 테스트 통과했습니다!" 뿌듯해할 거다. 나는 불안할 거다. 배포되고 나서도. 실 서비스 올라가고 나서도. 해커가 찾을까 봐. 뉴스 뜰까 봐. "○○ 핀테크 결제 API 해킹." 댓글 달릴까 봐. "보안팀 뭐했냐." 팀장 부를까 봐. "이거 테스트 안 했어?" 했다. 9시간 했다. 최선을 다했다. 근데 못 찾았다. 이게 제일 무섭다. 열심히 했는데 결과가 없는 것. 아니다. 결과가 있는데 믿을 수 없는 것. 새벽 4시, 마음 정리 생각을 바꿔야 한다. 이건 알고 있다. 취약점을 못 찾는 게 실패가 아니다. 찾을 수 있는 걸 놓친 게 실패다. 찾을 수 없는 건 어쩔 수 없다. 내가 할 수 있는 건 했다. OWASP Top 10 확인했다. 알려진 공격 다 시도했다. Business logic 검토했다. 소스 코드 리뷰 요청할 거다. 9시간 집중했다. 더 할 수 있는 게 있나. 있다. 항상 있다. 무한정 시간 쓸 수는 없다. 선을 그어야 한다. 여기까지가 내 책임이다. 나머지는 운이다. 아니다. 나머지는 배포 후 모니터링이다. 침입 탐지 시스템이다. 버그바운티 프로그램이다. 혼자 다 막을 수 없다. 팀으로 한다. 회사 전체가 한다. 조금 마음이 편해진다. 조금. 새벽 5시, 잠 눈 감는다. 여전히 불안하다. 근데 받아들인다. 내일 출근하면 리포트 쓸 거다. "취약점 발견되지 않음." 자신 있게 쓸 거다. 최선을 다했으니까. 그리고 다음 테스트 들어갈 거다. 또 찾을 거다. 또 못 찾을 수도 있다. 또 불안할 거다. 이게 보안 QA다. 찾으면 보람 있고, 못 찾으면 불안하다. 끝이 없다. 근데 누군가는 해야 한다. 회사 지키는 일. 사용자 지키는 일. 내일도 한다. 모레도 한다. 잠든다.9시간 테스트하고 못 찾았다. 내일 또 한다.