Web Application Security 외부 리소스 로딩
기본적으로, Aspose.Words 제품정보 Java DocumentBuilder를 사용하여 문서 또는 삽입 이미지를 가져올 때 이미지, CSS 스타일 또는 외부 HTML 문서와 같은 원격 리소스를로드 할 수 있습니다. 이 행동은 전체 세부 사항에서 문서를 처리 할 수 있지만 라이브러리가 웹 응용 프로그램의 일부 인 경우 일부 보안 위험의 이유가 될 수 있습니다.
이 문서에서는 외부 리소스를 적재하고 이러한 문제를 방지하는 방법에 대한 권장 사항을 제공 할 때 발생할 수있는 일반적인 보안 문제를 살펴 봅니다.
보안 문제
외부 리소스를 적재할 때 일반적인 보안 문제의 수는 있습니다.
Credential 공개 Linked 이미지
에 의해 Windows- 기반 호스트, * ‘\example.com\a\b*‘과 같은 UNC 경로를 사용하는 리소스에 대한 참조를 포함하는 문서는 기본적으로 처리됩니다. 도메인 환경에서는 지정된 서버에 해시 형식의 도메인 자격 증명을 보낼 호스트가 발생할 수 있습니다.
공격자가 사용자 또는 서버를 납득 할 수 있다면 해당 리소스 링크가 호스트에 지적하는 문서로 처리 할 수 있습니다. 공격자는 NTLM 해시 형식의 사용자 또는 서비스 계정 자격 증명을 받게됩니다. 그런 다음 같은 데이터는 고전적 인 pass-the-hash 공격에서 재사용 될 수 있으며 공격자는 피해자 사용자 또는 서비스 계정으로 모든 리소스에 액세스 할 수 있습니다.
문제의 계정이 약하거나 추측 가능한 암호를 사용하는 경우, 공격자는 추가적으로 더 악의적인 사용을 위해 계정 암호를 복구하는 암호 부수기 공격을 수행 할 수 있습니다.
지역 이미지 공개 Linked 이미지
이전 케이스와 마찬가지로, 로컬 이미지 파일에 대한 참조 문서를 처리하는 것은 최종 문서에 포함 된 그 파일에서 발생합니다. 이것은 민감한 정보 공개에 지도할 수 있습니다.
서비스 제공
공격자는 참조 또는 매우 큰 이미지 포함 된 문서를 업로드 할 수 있습니다 - 소위 “감압 폭탄”. 이 이미지를 처리 할 때, 라이브러리는 메모리와 CPU 시간의 엄청난 금액을 소비합니다.
Server-링크드 콘텐츠로 바로 가기
공격자는 내부 IP 주소와 포트의 일반적인 조합에 임베디드 링크가 포함 된 일련의 문서를 만들 수 있으므로 웹 서비스에 제출하십시오. Aspose.Words 문서 처리에 대한 라이브러리.
시간의 길이에 따라 서비스는 문서를 처리하는 데 사용됩니다. 공격자는 주어진 IP / 포트 조합이 방화벽에 의해 필터링되는 경우 결정할 수 있습니다
- 더 긴 처리 시간은 TCP SYN 패킷이 서버가 방화벽에 의해 떨어졌다는 것을 나타냅니다
- 빠른 처리 시간은 성공적인 연결을 나타냅니다
보안 문제 해결
위에서 설명한 문제를 해결하기 위해 웹 애플리케이션의 보안을 개선하기 위해 외부 리소스의 제어 또는 비활성화 할 수 있습니다. IResourceLoadingCallback·
다음 코드 예제는 외부 이미지로드를 비활성화하는 방법을 보여줍니다:
Java
public void loadDocument(String documentFilename) throws Exception
{
LoadOptions disableExternalImagesOptions = new LoadOptions();
disableExternalImagesOptions.setResourceLoadingCallback(new DisableExternalImagesHandler());
Document doc = new Document(documentFilename, disableExternalImagesOptions);
}
public static class DisableExternalImagesHandler implements IResourceLoadingCallback
{
public /*ResourceLoadingAction*/int resourceLoading(ResourceLoadingArgs args)
{
// Skip external images loading.
return (args.getResourceType() == ResourceType.IMAGE)
? ResourceLoadingAction.SKIP
: ResourceLoadingAction.DEFAULT;
}
}
다음 코드 예제는 원격 리소스를 비활성화하는 방법을 보여줍니다:
Java
public void loadDocument2(String documentFilename) throws Exception
{
LoadOptions disableRemoteResourcesOptions = new LoadOptions();
disableRemoteResourcesOptions.setResourceLoadingCallback(new DisableRemoteResourcesHandler());
Document doc = new Document(documentFilename, disableRemoteResourcesOptions);
}
private static class DisableRemoteResourcesHandler implements IResourceLoadingCallback
{
public /*ResourceLoadingAction*/int resourceLoading(ResourceLoadingArgs args) throws Exception
{
return isLocalResource(args.getOriginalUri())
? ResourceLoadingAction.DEFAULT
: ResourceLoadingAction.SKIP;
}
// Simplified code.
private static boolean isLocalResource(String fileName) throws Exception
{
String protocol = null;
URI uri = new URI(fileName);
if (uri.isAbsolute())
{
protocol = uri.getScheme();
}
else
{
URL url = new URL(fileName);
protocol = url.getProtocol();
}
return "file".equalsIgnoreCase(protocol);
}
}