Уеб приложения сигурност при зареждане на външни ресурси

По подразбиране, Aspose.Words вместо Java може да зарежда отдалечени ресурси като изображения, стилове CSS или външни HTML документи при внос на документи или въвеждане на изображения с помощта на DocumentBuilder. Това поведение ви позволява да обработвате документите си подробно, но може да бъде причина за някои рискове за сигурността, ако библиотеката е част от уеб приложение.

В тази статия разглеждаме общи въпроси, свързани със сигурността, които могат да възникнат при зареждане на външни ресурси и да предоставим препоръки как да се избегнат такива проблеми.

Въпроси, свързани със сигурността

Има редица типични проблеми със сигурността при зареждане на външни ресурси.

Credential Разкриване Via Linked Images

На Windows-базирани хостове, документи, съдържащи препратки към ресурси, които използват UNC пътеки като . .\ .com\a\b ще бъдат обработени по подразбиране. В среда на домейн, това ще накара хоста да изпрати своите домейни в хаширан формат на посочения сървър.

Ако нападателят е в състояние да убеди потребител или сървър да обработи документ с такъв ресурсна връзка, сочеща към хост, който те контролират, нападателят ще получи акредитивите на потребителя или сервизния акаунт във формат NTLM хаш. Тези данни могат да бъдат използвани повторно при класическа атака през хаш-хаш, което позволява на нападателя да получи достъп до всеки ресурс като потребител на жертвата или сметка за обслужване.

Ако въпросният акаунт използва слаба или предполагаема парола, нападателят може да извърши допълнително разбиваща парола атака, за да възстанови паролата на акаунта за по-нататъшно злонамерено използване.

Локално разкриване на изображения Via Linked Images

Подобно на предишния случай, обработката на документ с препратка към местен файл с изображение ще доведе до включването на файла в окончателния документ. Това може да доведе до деликатно разкриване на информация.

Отказ на служба

Атакуващ може да качи документ, който или е подбран, или включва изключително големи изображения, така наречените “декомпресионни бомби.” При обработката на тези изображения библиотеката ще консумира огромни количества памет и CPU време.

Server- Side Request Forgery Via Linked Content

Нападател може да създаде серия от документи, съдържащи вградени връзки към общи комбинации от вътрешен IP адрес и порт, след което да ги представи на уеб услуга, използвайки Aspose.Words библиотека за обработка на документите.

Въз основа на продължителността на времето услугата използва за обработка на документа, нападателят може да определи дали дадена IP/Port комбинация се филтрира от защитна стена:

  • по-дългото време за обработка показва, че 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);
	}
}