소프트웨어 개발보안 가이드 분석(2021) : 코드 삽입

코드 삽입

https://owasp.org/www-community/attacks/Code_Injection

코드 삽입이란 공격자가 소프트웨어의 입력값 유효성 검증 결함을 악용하여 코드를 삽입하고 실행시키는 보안약점입니다. 삽입되는 코드는 대상 애플리케이션의 언어(PHP, Python, Java 등)로 삽입되며 서버 측 인터프리터에 의해 실행됩니다.

코드 삽입 작동 방식

코드 삽입에 취약한 애플리케이션은 프로그램 코드에서 직접 정제되지 않은 데이터를 사용합니다. 사용되는 언어에 따라 응용 프로그램은 eval()과 같은 함수를 사용할 수 있습니다. 사용자가 제공한 문자열을 직접 연결하는 것은 안전한 처리 방법으로 간주되지 않습니다. 공격자는 이러한 유형의 취약점을 악용하여 애플리케이션 언어로 악성코드 문자열을 입력할 수 있습니다.

코드 삽입 예시

코드 삽입 공격을 유발할 수 있는 함수로는 eval(), setTimeOut(), setInterval() 등이 있습니다. 특히 코드 삽입이 발생되는 가장 큰 부분은 eval() 함수를 사용하는 경우 인자를 검증하지 않아 공격자가 삽입한(전달한) 코드가 그대로 실행이 되는 것입니다.

eval() 함수

eval() 함수 인자로 받은 문자열이 자바스크립트 코드가 맞는지 검증한 후 이를 실행하는 함수로 악성 스크립트에 자주 등장하는 함수

취약한 웹 어플리케이션의 예

1     Const express = require("express");
2      
3     Router.post("/vuln/server", (req, res) => {
4          // 사용자로부터 전달 받은 값을 그대로 eval 함수의 인자로 전달
5     Const data = dval(req.body.data);
6     Return res.send({ data });
7     });

eval 함수는 인자로 받은 코드를 caller 권한으로 수행하는 위험한 함수입니다.

3행 : 라우터는 POST 요청이 "/vuln/server" 엔드포인트로 들어오면 실행됩니다.

5행 : 3행의 요청으로부터 전달된 데이터(req.body.data)를 eval 함수의 인자로 전달하여 실행합니다.

이처럼 코드를 작성하게 된다면 입력값 검증을 하지 않기 때문에 사용자가 악의적인 내용을 담아 전달하는 경우 예상치 못하는 사고가 발생할 수 있습니다.

시큐어 코딩 적용 방법

@RequestMapping(value = "/execute", method = RequestMethod.(GET)
public String execute(@RequestParam("src") String src) throws ScriptException {
     // 정규식을 이용하여 특수문자 입력 시 예외를 발생시킨다.
     if(src.matches("[\ \w]*") == false) {
          throw new IllegalArgumentException();
     }
     ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
     ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
     String retValue = (String)scriptEngine.eval(src);
     return retValue;
}

코드 삽입 예방

동적 코드를 실행할 수 있는 함수를 사용하지 말아야 합니다. 하지만 꼭 필요한 경우라면, 실행 가능한 동적 코드를 입력 값으로 받지 않도록 하며, 외부 입력 값에 대해서 화이트리스트 방식으로 구현합니다. 즉, 유효한 문자만 포함하도록 동적 코드에 사용되는 사용자 입력 값을 필터링합니다.

  • 입력 검증
    모든 입력 데이터에 대해 엄격한 검증을 수행하여 악성코드 삽입을 방지해야 합니다. 입력 데이터가 예상한 형식과 일치하는지 확인하고, 필요한 경우 특수 문자를 제거하거나 이스케이프 처리를 수행해야 합니다.
  • 출력 이스케이프
    사용자 입력을 출력할 때는 반드시 이스케이프 처리를 해야 합니다. 모든 사용자 입력을 안전하게 출력하기 위해 HTML, CSS, JavaScript 등의 특수 문자를 이스케이프 하여 사용해야 합니다.
  • 보안 정책 적용
    적절한 보안 정책을 적용하여 코드 삽입 공격을 방지해야 합니다. CSP (Content Security Policy)를 사용하여 실행되는 스크립트의 출처를 제한하고, XSS 필터링을 수행하여 XSS 공격을 막을 수 있습니다.
  • 사용자 권한 관리
    최소한의 권한으로 애플리케이션을 실행하도록 사용자 권한을 관리해야 합니다. 사용자에게 필요한 권한만 부여하여 악성코드 삽입으로 인한 피해를 최소화할 수 있습니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : SQL 삽입
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : 경로 조작 및 자원 삽입