메뉴 건너뛰기

app

CWE-676, 242, 246, 382 위험한 함수 호출: 취약한 API 사용 방지 전략

suritam92026.01.17 14:55조회 수 1댓글 0

    • 글자 크기

1. 취약한 API 사용의 위험성

소프트웨어 개발 키트(SDK)나 라이브러리에서 제공하는 일부 함수들은 설계 당시의 한계나 보안상의 이유로 현재는 사용이 권장되지 않습니다. 예를 들어, 입력을 무제한으로 받는 함수(CWE-242), 예외 처리를 무시하고 프로세스를 즉시 종료시키는 함수(CWE-382), 혹은 플랫폼 간 호환성이 결여된 함수들은 공격자가 시스템을 비정상적인 상태로 유도하거나 버퍼 오버플로우를 유발하는 빌미가 됩니다. 보안 진단 도구는 이러한 '위험 리스트'에 있는 API가 코드 내에 존재하는지 엄격히 체크합니다.

2. 주요 취약 API 패턴과 문제점

  • CWE-382 (System.exit 직접 호출): 웹 애플리케이션(WAS) 환경에서 특정 로직의 에러로 인해 System.exit()가 호출되면, 해당 요청만 종료되는 것이 아니라 서버 프로세스 전체가 중단되어 서비스 가용성이 파괴됩니다.

  • CWE-676 (위험한 메서드 사용): 스레드의 상태를 강제로 제어하는 Thread.stop(), Thread.suspend() 등은 자원 잠금(Lock)을 해제하지 못해 데드락(Deadlock)을 유발할 수 있습니다.

  • CWE-242/246 (예측 불가능한 동작): 특정 입력값에 따라 결과가 일정하지 않거나 메모리 오염 가능성이 있는 오래된 C 스타일의 입출력 함수들이 이에 해당합니다.

3. 실무적 대응: 안전한 대체재 활용

취약한 API를 제거하는 가장 좋은 방법은 현대적인 대체 함수를 사용하는 것입니다. 프로세스를 강제로 죽이는 대신 예외(Exception)를 던져 상위에서 처리하게 하고, 스레드 제어는 상태 변수(Flag)를 이용한 부드러운 종료 방식을 채택해야 합니다. 만약 하위 호환성이나 특정 기능 구현을 위해 어쩔 수 없이 해당 API를 사용해야 한다면, 그 위험성을 인지하고 입력값을 사전에 철저히 검증하는 방어 로직을 선행해야 합니다.

4. 취약한 API 개선 및 통합 보안 적용 자바 코드 예시

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

public class ApiSecurityManager {

    private static final Logger logger = LoggerFactory.getLogger(ApiSecurityManager.class);

 

    // [CWE-382 조치] System.exit() 대신 예외 전파 사용

    public void processCriticalTask(String status) {

        if ("FATAL_ERROR".equals(status)) {

            logger.debug("Fatal error detected. Throwing exception instead of System.exit().");

            

            // 시스템 전체를 종료시키는 대신, 비즈니스 예외를 던져 안전하게 후속 처리

            throw new RuntimeException("Critical business failure. Task aborted.");

        }

    }

 

    // [CWE-676 조치] Thread.stop() 대신 플래그 기반 종료 사용

    public void safeThreadControl(WorkerThread worker) {

        try {

            logger.debug("Requesting worker thread to stop safely.");

            

            // worker.stop(); // 사용 금지 (CWE-676)

            worker.requestStop(); // 내부 상태 변수를 변경하여 스레드가 스스로 종료되게 유도

            

        } catch (Exception e) {

            // [CWE-754, CWE-390] 예외 상황 로깅

            logger.debug("Error during thread control: {}", e.getMessage());

        }

    }

 

    public void executeAppLogic() {

        try {

            processCriticalTask("NORMAL");

            logger.debug("Application logic executed smoothly.");

        } catch (Exception e) {

            // [CWE-209] 사용자에게는 최소 정보만 노출하고 상세 내용은 debug 로그에 기록

            logger.debug("Application error context: {}", e.getMessage());

        }

    }

}

 

class WorkerThread extends Thread {

    private volatile boolean running = true;

 

    public void requestStop() {

        this.running = false;

    }

 

    @Override

    public void run() {

        while (running) {

            // 작업 수행...

        }

    }

}

코멘트: 시큐어 코딩은 단순히 공격을 막는 기술을 넘어, 시스템이 의도한 대로만 작동하게 만드는 설계의 미학입니다. System.exit()Thread.stop()과 같이 시스템의 흐름을 파괴하는 취약한 API 대신, 예외 처리와 상태 제어를 통한 안정적인 코드를 작성하십시오. 특히 비즈니스 로직 중단 시에는 logger.debug()를 활용하여 상세한 문맥을 기록하되, 전체 서비스의 가용성(Availability)을 해치지 않는 방향으로 구현하는 것이 전문가의 시큐어 코딩 전략입니다.

    • 글자 크기
시스템의 제어권을 빼앗는 CWE-94, CWE-95 코드 삽입 (by suritam9) CWE-330: 예측 가능한 난수값 사용의 위험성 (by suritam9)

댓글 달기

첨부 (0)
위로