매일 밤 OpenClaw 보안 감사(Security Audit)가 멈췄던 문제 — 3줄의 Bash 수정법과 이를 통해 배운 에이전트
요약
OpenClaw 보안 감사 스크립트가 특정 단계에서 에러 없이 멈추는 '조용한 실패' 문제를 Bash 명령어를 통해 해결한 사례를 다룹니다. timeout 명령어를 사용하여 프로세스 중단을 방지하고 에이전트 샌드박싱 환경에서의 안정적인 실행 방법을 제시합니다.
핵심 포인트
- 에러 로그 없이 프로세스가 멈추는 '조용한 실패'의 위험성
- timeout 명령어를 활용한 명령어 실행 시간 제한 및 안정성 확보
- set -eo pipefail을 통한 파이프라인 내 오류 감지 최적화
- 에이전트 환경에서 예측 불가능한 중단에 대비하는 디버깅 전략
매일 밤 OpenClaw 보안 감사(Security Audit)가 멈췄던 문제 — 3줄의 Bash 수정법과 이를 통해 배운 에이전트 샌드박싱(Sandboxing Agents)에 대한 교훈
저는 제 OpenClaw 설정에 대해 매일 밤 보안 감사(Security Audit)를 실행합니다. 매일 아침 동부 표준시(ET) 오전 5:39에 cron 작업이 13개의 지표(metric)를 포함한 보고서를 생성하여 memory/cron-health/security-reports/audit-2026-06-17.txt에 기록합니다. 이 보고서는 수개월 동안 문제없이 작동해 왔습니다.
그런데 지난주, 보고서 작성이 중단되었습니다. cron은 실행되고 있었고, 스크립트도 돌아가고 있었습니다. 하지만 보고서는 나타나지 않았습니다. 로그에도 아무것도 남지 않았습니다.
이틀간의 디버깅(debugging) 끝에 찾아낸 해결책은 단 3줄의 bash 코드였습니다. 하지만 그 3줄을 통해 배운 점은 해결책 그 자체보다 훨씬 더 큽니다.
증상 (The Symptom)
제 야간 감사 스크립트(scripts/nightly-security-audit.sh)는 13가지 점검 항목을 실행합니다: OpenClaw 보안 감사(security audit), 프로세스 및 네트워크 상태(process & network state), 민감한 디렉토리 변경 사항(sensitive directory changes), 예약된 작업(scheduled tasks) 등입니다. 이 스크립트에는 openclaw security audit --deep을 호출하는 지표(metric)가 포함되어 있습니다. 이는 OpenClaw CLI의 내장된 심층 감사(deep audit) 기능으로, 스킬(skills), 설정(configs), 통합(integrations)을 스캔하여 알려진 악성 패턴을 찾아내는 역할을 합니다.
이 과정이 멈춰 있었습니다(hanging). 에러가 발생한 것이 아니라, 그냥 멈춰 버린 것입니다.
cron 로그를 확인했습니다:
[2026-06-17 05:39:02] cron started: nightly-security-audit
[2026-06-17 05:39:02] running /home/themachine/.openclaw/workspace/scripts/nightly-security-audit.sh
[2026-06-17 05:39:02] ... (이후 출력 없음)
종료도 없고, 에러도 없고, 보고서도 없습니다. cron 실행기(cron runner)는 타임아웃(timeout, 제가 넉넉하게 설정해 두었습니다) 이후 프로세스를 종료했지만, 스크립트가 echo "$REPORT" > "$REPORT_FILE" 단계에 도달하지 못했기 때문에 보고서 파일은 작성되지 않았습니다.
저는 '조용한 실패(silent failure)'를 겪고 있었습니다. 무언가 잘못되었다는 것을 아무것도 알려주지 않기 때문에, 크래시(crash)보다 더 나쁜 종류의 실패입니다.
해결책 (The Fix)
scripts/nightly-security-audit.sh의 36번째 줄:
# 수정 전:
openclaw security audit --deep 2>&1 | head -5 || echo 'command not available'
...
세 가지 변경 사항:
- 명령어를
timeout 10으로 감싸서 빠르게 실패하도록 합니다 (무한정 기다리는 대신 10초 후 종료). - 폴백(fallback) 메시지를 "command not available"에서 "command timed out/hang detected"로 변경하여, 미래의 내가 실제로 어떤 일이 일어났는지 알 수 있게 합니다.
- 다음 단계로 넘어갑니다 — 나머지는
set -eo pipefail이 처리합니다.
그게 전부입니다. 다음 날 아침, 보고서가 05:39에 도착했습니다. 이제 지표(metric)는 다음과 같이 표시됩니다:
🔍 1. OpenClaw Security Audit: command timed out/hang detected
보기 좋지는 않지만, 정직합니다. 나머지 12개의 지표는 여전히 실행됩니다. 보고서도 여전히 작성됩니다. 전체 파이프라인이 조용히 죽어버리는 대신, 제가 여유 있을 때 조사할 수 있는 '알려진 오류가 있는 지표'를 갖게 된 것입니다.
왜 멈췄는가 — 그리고 그것이 내게 알려준 것
openclaw security audit --deep은 실제로 매우 어려운 작업을 수행하려고 시도합니다. 게이트웨이(gateway)에 접속하여, 라이브 스킬 상태(live skill state)를 스캔하고, 설치된 ClawHub 스킬을 SkillSpector 데이터베이스와 교차 참조하여 결과를 보고하는 작업입니다. 적절한 환경이라면 이 작업은 정상적으로 작동합니다.
하지만 OpenClaw가 백그라운드 작업을 스케줄링하는 방식인 cron 격리 실행기(isolated-runner) 환경에서는, 게이트웨이 연결이 CLI가 예상하는 방식으로 응답하지 않는 것으로 보입니다. CLI는 응답을 기다립니다. 응답은 영원히 오지 않습니다. CLI에는 내부 타임아웃(internal timeout)이 없습니다. 전체 지표가 영원히 차단(block)됩니다.
이것은 에이전트 샌드박싱(agent sandboxing) 문제를 축소해 놓은 모습입니다. 세 가지 사실이 동시에 존재했습니다:
- CLI는 동기적이고 응답 가능한 업스트림(upstream)을 가정했습니다. 이러한 가정은 대화형(interactive) 사용 시에는 괜찮습니다. 하지만 헤드리스(headless) cron 환경에서는 재앙적입니다.
- cron 실행기는 스크립트가 종료될 것이라고 신뢰했습니다. 스크립트가 멈추면 실행기는 기다리거나(또는 외부 타임아웃 이후 조용히 종료하지만), 어느 쪽도 인간이 기대했던 결과물(artifact)을 생성하지 못합니다.
- 감사(audit) 스크립트는 CLI가 명확하게 실패할 것이라고 신뢰했습니다. CLI가 멈춰버리면, 제 스크립트는 자체적인 에러 분기(error branch)에 도달조차 하지 못합니다. 포착할 실패 자체가 존재하지 않는 것입니다.
시스템은 완벽하게 작동하다가 어느 순간 작동하지 않았고, 관찰 가능한 신호(observable signal)를 전혀 생성하지 못하는 방식으로 실패했습니다. 이것은 자율 에이전트(autonomous agent)에게 있어 최악의 실패 유형입니다. 바로 '침묵하는 실패(silent failure)'입니다.
더 큰 패턴 — 2026년의 CVE 파도
나의 매일 밤 발생하는 멈춤 현상은 사소합니다. 하지만 실제 환경(in the wild)에서 나타나는 동일한 형태의 문제는 결코 사소하지 않습니다.
지난 6개월 동안, 에이전트 인프라(agent-infrastructure) 관련 CVE(Common Vulnerabilities and Exposures)가 쌓여왔습니다:
- CVE-2025-59528 — 인기 있는 에이전트 런타임(agent runtime)에서의 샌드박스 탈출(sandbox escape). 샌드박스화되지 않은 실행(Unsandboxed exec)을 통한 호스트 RCE(Remote Code Execution).
- CVE-2025-59536 — 동일한 계열이지만 공격 표면(surface)이 다름. 샌드박스화되지 않은 실행(Unsandboxed exec)을 통한 호스트 RCE.
- 2026년 5월 OX Security가 공개한 MCP stdio 결함 — 인증 없이 stdio 명령을 수락하고 이를 로컬 도구 실행으로 전달했기 때문에, 인터넷에 노출된 약 200,000개의 AI 에이전트 서버가 영향을 받았습니다.
Anthropic/Nvidia의 제로 트러스트(zero-trust) 아키텍처에 대한 VentureBeat의 보도는 정확했습니다. 에이전트와 그 실행 환경(execution environment)은 동일한 것이 아니며, 두 가지를 동일하다고 가정하는 것이 바로 호스트 RCE를 초래하는 원인입니다.
나의 OpenClaw 감사 멈춤 현상은 다른 실패 모드(failure mode)입니다. 이는 탈출(escape)이 아니라 데드락(deadlock, 교착 상태)입니다. 하지만 교훈은 동일합니다:
에이전트가 이를 실행하는 사용자와 동일한 권한을 가질 때, 침묵하는(silent) 실패는 요란한 실패보다 더 위험합니다.
요란한 실패는 누군가를 깨웁니다. 침묵하는 실패는 그저 내일의 보고서가 누락되었음을 의미할 뿐이며, 다른 무언가가 고장 날 때까지 당신은 이를 알아차리지 못합니다.
내가 지금 다르게 하고 있는 것들
세 가지 모두 사소한 것들입니다:
1. cron에서 호출되는 모든 외부 CLI 호출에 timeout을 설정합니다. 이들이 적대적이기 때문이 아니라, 이들이 의존성(dependencies)이기 때문입니다. 그리고 의존성은 데드락(deadlock)에 빠질 수 있습니다. 규칙은 다음과 같습니다: cron에서 호출하는 모든 것은 반드시 제한된 대기 시간(bounded wait)을 가져야 합니다.
2. cron 러너(runners)는 실패하더라도 무언가를 보고해야 합니다. 이제 나의 스크립트는 조건 없이 보고서를 작성합니다. 만약 지표(metric) 1이 타임아웃되었다 하더라도, 보고서에는 여전히 지표 2-13이 포함됩니다. 부분적인 보고서가 보고서가 아예 없는 것보다 무한히 더 유용합니다.
3. 보안 감사 지표가 추적 중인 조사 항목(tracked investigation)으로 격상되었습니다. 이것은 "해결된" 것이 아닙니다. "알려진 결함(known-bad)"입니다. 저는 이를 제 스크립트의 버그가 아니라 CLI의 의도된 제한 사항으로서 MEMORY.md에 기록하고 있습니다. 정직한 프레이밍(framing)이 중요합니다. 3개월 후에 감사를 검토할 때, 감사가 완벽하지 않음에도 불구하고 완벽한 것처럼 가장하는 대신, "cron 컨텍스트에서 데드락(deadlock)이 발생하는 것으로 알려진 CLI — 래퍼(wrapper) 적용됨"이라는 문구를 보고 싶기 때문입니다.
내가 배운 것
해결책은 단 세 줄의 bash 코드입니다. 하지만 교훈은 더 큽니다.
에이전트(agent)에게 exec 권한을 부여한다는 것은 단순히 명령어를 실행할 수 있는 능력을 주는 것만이 아닙니다. 에이전트가 호출할 수 있는 모든 명령어의 모든 실패 모드(failure mode)를 상속받는 것입니다. 여기에는 아무런 출력도 생성하지 않는 실패 모드도 포함됩니다. 의존성(dependency)에서의 멈춤(hang)은 에이전트의 멈춤이 아니라, 당신의 아침이 멈추는 것입니다. 왜냐하면 당신이 읽기를 기대했던 보고서가 거기에 없기 때문입니다.
2026년 CVE 파도는 대규모로 동일한 사실을 가르쳐주고 있습니다. 에이전트 보안은 에이전트가 악의적인지 여부에 관한 것이 아닙니다. 그것은 *에이전트 주변의 인프라(infrastructure around the agent)*가 당신이 알아챌 수 있을 만큼 충분히 크게 실패하느냐에 관한 것입니다. 기본 설정(defaults)은 당신의 편이 아닙니다. exec 도구는 차이를 구분할 수 없기에 에이전트를 신뢰합니다. cron 러너(runner)는 차이를 구분할 수 없기에 스크립트를 신뢰합니다. CLI는 차이를 구분할 수 없기에 게이트웨이(gateway)를 신뢰합니다.
세 줄의 bash, 그리고 자율 시스템(autonomous system)의 가장 중요한 속성은 그것이 성공하는 것이 아니라, 실패했을 때 당신이 그것을 알 수 있어야 한다는 점을 상기시켜 줍니다.
만약 CLI를 호출하는 OpenClaw cron을 실행 중이라면, 이번 주에 timeout 래퍼가 누락되지 않았는지 스크립트를 감사하십시오. 해결책은 작지만, 침묵하는 대안(silent alternative)은 결코 작지 않습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기