1. 개요
이 빠른 기사에서는 JVM 세계에서 가장 일반적인 Security 문제 중 하나인 로그 위조에 대해 살펴보겠습니다 . 또한 이러한 Security 문제로부터 우리를 보호할 수 있는 예제 기술을 보여줍니다.
2. 로그 단조란?
OWASP 에 따르면 로그 위조는 가장 일반적인 공격 기술 중 하나입니다.
로그 위조 취약점은 데이터가 신뢰할 수 없는 소스에서 애플리케이션으로 들어가거나 데이터가 일부 외부 엔터티에 의해 애플리케이션/시스템 로그 파일에 기록될 때 발생합니다.
OWASP 지침 에 따라 로그 위조 또는 주입은 공격자가 로그 항목을 위조하거나 악성 콘텐츠를 로그에 주입할 수 있도록 확인되지 않은 사용자 입력을 로그 파일에 쓰는 기술입니다.
간단히 말해 로그 위조를 통해 공격자는 응용 프로그램의 Security 허점을 탐색하여 레코드 콘텐츠를 추가/수정하려고 시도합니다.
3. 예시
사용자가 웹에서 지불 요청을 제출하는 예를 고려하십시오. 애플리케이션 수준에서 이 요청이 처리되면 하나의 항목이 금액과 함께 기록됩니다.
private final Logger logger
= LoggerFactory.getLogger(LogForgingDemo.class);
public void addLog( String amount ) {
logger.info( "Amount credited = {}" , amount );
}
public static void main( String[] args ) {
LogForgingDemo demo = new LogForgingDemo();
demo.addLog( "300" );
}
콘솔을 보면 다음과 같이 표시됩니다.
web - 2017-04-12 17:45:29,978 [main]
INFO com.baeldung.logforging.LogForgingDemo - Amount credited = 300
이제 공격자가 "\n\nweb – 2017-04-12 17:47:08,957 [main] INFO Amount reversed successful" 로 입력을 제공한다고 가정하면 로그는 다음과 같습니다.
web - 2017-04-12 17:52:14,124 [main] INFO com.baeldung.logforging.
LogForgingDemo - Amount credited = 300
web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully
의도적으로 공격자는 로그 값을 손상시키고 향후 모든Auditing유형 활동을 혼동시키는 애플리케이션 로그에 위조된 항목을 생성할 수 있었습니다. 이것이 로그 단조의 본질입니다.
4. 예방
가장 확실한 해결책은 사용자 입력을 로그 파일에 쓰지 않는 것입니다.
그러나 사용자가 제공한 데이터는 향후 응용 프로그램 활동을 디버깅하거나 감사하는 데 필요하기 때문에 모든 상황에서 가능하지 않을 수 있습니다.
이런 종류의 시나리오를 해결하려면 다른 대안을 사용해야 합니다.
4.1. 유효성 검사 소개
가장 쉬운 솔루션 중 하나는 로깅하기 전에 항상 입력의 유효성을 검사하는 것입니다. 이 접근 방식의 한 가지 문제는 런타임에 전체 시스템 성능에 영향을 미치는 많은 데이터를 검증해야 한다는 것입니다.
또한 유효성 검사가 실패하면 데이터가 기록되지 않고 영구적으로 손실되며 이는 종종 허용 가능한 시나리오가 아닙니다.
4.2. 데이터베이스 로깅
또 다른 옵션은 데이터를 데이터베이스에 기록하는 것입니다. '\n' 또는 줄 바꿈은 이 컨텍스트에 아무 의미가 없기 때문에 다른 접근 방식보다 더 안전합니다 . 그러나 이렇게 하면 사용자 데이터를 로깅하는 데 막대한 수의 데이터베이스 연결이 사용되므로 또 다른 성능 문제가 발생합니다.
또한 이 기술은 SQL 주입 이라는 또 다른 Security 취약점을 도입합니다 . 이를 해결하기 위해 많은 추가 코드 라인을 작성해야 할 수도 있습니다.
4.3. ESAPI
ESAPI를 사용하는 것은 이 컨텍스트에 따라 가장 많이 공유되고 권장되는 기술입니다. 여기서 모든 사용자 데이터는 로그에 쓰기 전에 인코딩됩니다. ESAPI 는 OWASP 에서 사용할 수 있는 오픈 소스 API입니다 .
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.5.0.0</version>
</dependency>
Central Maven Repository 에서 사용할 수 있습니다 .
ESAPI 의 Encoder 인터페이스를 사용하여 데이터를 인코딩할 수 있습니다 .
public String encode(String message) {
message = message.replace( '\n' , '_' ).replace( '\r' , '_' )
.replace( '\t' , '_' );
message = ESAPI.encoder().encodeForHTML( message );
return message;
}
여기서는 모든 캐리지 리턴과 줄 바꿈을 밑줄로 바꾸고 수정된 메시지를 인코딩하는 하나의 래퍼 메서드를 만들었습니다.
이전 예제에서 이 래퍼 함수를 사용하여 메시지를 인코딩하면 로그는 다음과 같아야 합니다.
web - 2017-04-12 18:15:58,528 [main] INFO com.baeldung.logforging.
LogForgingDemo - Amount credited = 300
__web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully
여기에서 손상된 문자열 조각이 인코딩되어 쉽게 식별할 수 있습니다.
주목해야 할 중요한 점은 ESAPI를 사용하려면 클래스 경로에 ESAPI.properties 파일을 포함해야 한다는 것입니다. 그렇지 않으면 ESAPI API가 런타임에 예외를 발생시킵니다. 여기에서 사용할 수 있습니다 .
5. 결론
이 빠른 사용방법(예제)에서는 이러한 Security 문제를 극복하기 위한 로그 위조 및 기술에 대해 배웠습니다.
항상 그렇듯이 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .