🚧 오류 상황 대응 부재 시뮬레이터 KISA A-4 · 오류 상황 대응 부재
송금 루틴이 일련의 단계를 수행합니다 — 로그 열기, 버퍼 할당, 트랜잭션 시작, 출금, 입금, 커밋. 취약 버전은 모든 반환값을 무시해, 한 단계가 실패해도 잘못된 상태로 계속 진행합니다: 돈이 빠져나갔는데 입금은 안 됩니다.
⚙ 실패 주입
어느 단계가 실패할지 선택한 뒤, 동일한 실패로 두 버전을 실행하세요. 취약 버전은 그대로 진행하고, 안전 버전은 감지·롤백·안전 중단하는 차이를 확인하세요.
① 취약: 반환값 무시 VULNERABLE
(실행 전)
② 안전: 모든 반환 검사 · 실패 시 롤백 SECURE
(실행 전)
③ 취약 vs 안전 코드
VULNERABLE
// C / pseudo — 반환값을 아무도 안 본다 FILE *f = fopen(path, "a"); // NULL 일 수 있음 char *buf = malloc(size); // NULL 일 수 있음 fprintf(f, ...); // f==NULL 이면 크래시 db_begin(tx); db_debit(tx, from, amount); // 성공 가정 db_credit(tx, to, amount); // 네트워크 실패해도 무시 db_commit(tx); // 실패해도 무시 return OK; // 항상 성공이라 보고
SECURE
FILE *f = fopen(path, "a");
if (!f) return ERR_LOG; // 검사
char *buf = malloc(size);
if (!buf){ fclose(f); return ERR_MEM; } // 검사 + 정리
if (db_begin(tx) != OK){ ... return ERR_TX; }
if (db_debit(tx, from, amount) != OK){
db_rollback(tx); return ERR_DEBIT; }
if (db_credit(tx, to, amount) != OK){
db_rollback(tx); return ERR_CREDIT; } // 출금 원복
if (db_commit(tx) != OK){
db_rollback(tx); return ERR_COMMIT; }
return OK; // 진짜 성공일 때만
위험한 이유: 반환값/오류코드를 무시하면 잘못된 상태로 실행이 계속됩니다 — NULL 포인터를 쓰거나, 버퍼가 절반만 기록되거나, 한 계좌에서 돈이 빠졌는데 상대 계좌에 도착하지 않습니다. 데이터가 깨졌는데도 시스템은 성공으로 보고합니다. 방어: 호출 지점마다 모든 반환값을 검사/예외를 처리하고, 실패 시 자원 정리·트랜잭션 롤백·명확한 오류로 안전하게 중단하세요. 절대 조용히 진행하지 마세요.
⚠️ 교육용 시뮬레이션입니다. 송금 파이프라인·실패·원장은 페이지 내부 mock이며, 실제 파일·메모리·네트워크·데이터베이스를 건드리지 않습니다.