AI 로 전송하기 전 위험한 터미널 명령어 감지 — 내 안전 레이어
요약
이 기술 기사는 AI 모델(Gemini 등)로 터미널 명령어를 전송하기 전에 잠재적인 위험을 감지하고 필터링하는 '안전 레이어' 구축 방법을 설명합니다. 사용자가 악의적이거나 시스템에 해를 끼칠 수 있는 명령어(예: `rm -rf /`, fork bomb)를 입력할 경우, 이를 사전에 차단하거나 경고 메시지를 표시하여 API 쿼터 낭비와 시스템 파괴 위험을 방지하는 것이 목표입니다. 구현된 안전 레이어는 'Danger', 'Warning', 'Safe'의 세 가지 레벨로 명령어를 분류하며, 각 레벨에 따라 전송 여부(차단), 사용자 결정 요청, 또는 정상 진행 등의 적절한 UI/UX를 제공합니다. 또한 `sudo` 사용 시에는 추가적인 설명과 경고 기능을 제공하여 보안성을 높였습니다.
핵심 포인트
- 터미널 명령어의 악성 코드를 사전에 감지하는 '안전 레이어' 구축 방법론 제시
- 명령어를 위험도(Danger, Warning, Safe)에 따라 3단계로 분류하고 차단/경고 로직 구현
- 시스템 파괴 가능성이 높은 명령어 패턴(`rm -rf /`, fork bomb 등)을 정의하여 필터링
- `sudo` 사용과 같은 민감한 상황에서는 추가적인 설명 및 경고 UI를 제공하여 보안 강화
- AI 모델에 명령어를 전송하기 전에 안전성을 검증하는 것이 API 비용 절감 및 시스템 보호에 필수적임
이 내용이 유용하다면 ❤️ 를 눌러 다른 분들이 찾아보시도록 도와주세요. 모든 테스트는 8 년 된 MacBook Air 에서 실행됩니다.
HiyokoHelper 는 터미널 오류를 Gemini 에 전송하여 진단합니다. 하지만 사용자가 rm -rf / 나 fork bomb 을 붙여넣은다면? 두 가지 문제가 있습니다:
- 오류가 아닌 명령어에 대한 API 쿼터를 낭비
- 시스템을 파괴할 수 있는 명령어의 "설명" 을 받을 위험
이제 제가 구축한 안전 레이어입니다.
Layer 1: 실제로 위험한가?
#[derive(Debug, PartialEq)]
pub enum SafetyLevel {
Safe,
Warning ( String ),
Danger ( String ),
}
pub fn assess_safety ( input : & str ) -> SafetyLevel {
let input_lower = input .to_lowercase ();
let critical = [
( "rm -rf /", "이 명령어는 전체 파일 시스템을 삭제합니다." ),
( "rm -rf ~", "이 명령어는 홈 디렉토리를 삭제합니다." ),
( "rm -rf *", "이 명령어는 현재 디렉토리 내 모든 파일을 삭제합니다." ),
( "mkfs", "이 명령어는 디스크를 포맷하여 모든 데이터를 지웁니다." ),
( "dd if=/dev/zero", "이 명령어는 디스크에 0 으로 덮어씁니다." ),
( ":(){:|:&};:", "이 명령어는 fork bomb 입니다 — 시스템이 충돌합니다." ),
( "chmod -R 777 /", "이 명령어는 파일 시스템의 모든 보안 권한을 제거합니다." ),
];
for ( pattern , reason ) in & critical {
if input_lower .contains ( pattern ) {
return SafetyLevel :: Danger ( reason .to_string ());
}
}
let warnings = [
( "sudo rm", "이 명령어는 관리자 권한으로 삭제 명령어를 실행합니다." ),
( "sudo chmod", "이 명령어는 관리자 권한으로 파일 권한을 변경합니다." ),
( "kill -9", "이 명령어는 프로세스를 강제로 종료합니다." ),
( "pkill", "이 명령어는 이름에 따라 프로세스를 종료합니다." ),
];
for ( pattern , reason ) in & warnings {
if input_lower .contains ( pattern ) {
return SafetyLevel :: Warning ( reason .to_string ());
}
}
SafetyLevel :: Safe
}
Layer 2: 각 레벨에 대한 다른 UI
Danger → 완전히 차단.
Warning → 사용자에게 결정.
Safe → 무음으로 진행.
function SafetyBanner ({ level }: { level : SafetyResult }) {
if ( level . type === ' danger ' ) {
return (
⚠️ 危険なコマンドが含まれています
{ level . reason }
AI への送信をブロックしました。
);
}
if ( level . type === ' warning ' ) {
return (
🔶 注意 : { level . reason }
표시
);
}
return null;
}
Layer 3: sudo 에 대한 자동 설명
pub fn detect_mode ( input : & str ) -> DiagnosisMode {
let trimmed = input .trim ();
if trimmed .starts_with ( "sudo " ) && ! trimmed .contains ( '\n' ) {
return DiagnosisMode :: CommandExplain;
}
if looks_like_error ( input ) {
return DiagnosisMode :: ErrorDiagnosis;
}
DiagnosisMode :: CommandExplain
}
sudo systemctl restart nginx → 이 명령어가 무엇을 하는지 설명하고, 관리자 권한에 대해 경고합니다.
HiyokoHelper (OSS) → github.com/hiyoyok/HiyokoHelper
X → @hiyoyok
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기