Как Visual Studio 2022 съела 100 Гб памяти и при чём здесь XML бомбы?
В апреле 2021 года Microsoft анонсировала новую версию своей IDE – Visual Studio 2022, попутно объявив, что она будет 64-битной. Сколько мы этого ждали — больше никаких ограничений по памяти в 4 Гб! Однако, как оказалось, есть нюансы.
Кстати, если вы пропустили, вот ссылка на тот пост с анонсом.
Но вернёмся к нашему вопросу из заголовка. Я воспроизвёл эту проблему на последней доступной на момент написания заметки версии Visual Studio 2022 Preview — 17.0.0 Preview 3.1.
Для воспроизведения достаточно:
- создать проект пустого решения (шаблон Blank Solution);
- добавить в него XML-файл.
После этого в созданный XML-файл нужно попробовать скопировать следующий текст:
Теперь идём заваривать кофе, возвращаемся и наблюдаем за тем, как Visual Studio отжирает всё больше и больше ОЗУ.

Могут возникнуть 2 вопроса:
- Зачем делать какие-то странные XML и добавлять их в проекты?
- Что здесь вообще происходит?
Что ж, давайте разбираться. Для этого нам нужно будет вспомнить, какие опасности может нести неаккуратная обработка XML-файлов, а также узнать, как со всем этим связан статический анализатор PVS-Studio.
SAST в PVS-Studio
Мы продолжаем активно развивать PVS-Studio как SAST решение. Если говорить про C# анализатор, то основной фокус по этому фронту – поддержка OWASP Top 10 2017 (последняя доступная на данный момент версия – с нетерпением ждём обновления). К слову, если вы пропустили, не так давно мы добавили taint анализ, о чём можно почитать здесь.
Собственно, для тестирования работы анализатора я и создал (точнее, попытался создать) соответствующий синтетический проект. Дело в том, что одна из категорий OWASP Top 10, над которой сейчас ведётся работа, – A4:2017-XML External Entities (XXE). Она затрагивает уязвимость приложений к различным атакам посредством неправильной обработки XML-файлов. Что подразумевается под неправильной обработкой? Например, излишнее доверие к входным данным (извечная проблема многих уязвимостей) и отсутствие должных ограничений в парсерах XML.
В итоге, если файлы окажутся скомпрометированы, это может вылиться в разные неприятные последствия. Здесь можно выделить 2 основные проблемы: раскрытие каких-то данных и отказ в обслуживании. Обе имеют соответствующие CWE:
- CWE-611: Improper Restriction of XML External Entity Reference
- CWE-776: Improper Restriction of Recursive Entity References in DTDs (‘XML Entity Expansion’)
CWE-611 оставим на другой раз, сегодня нас интересует CWE-776.
XML бомбы (billion laughs attack)
Я поясню только основную суть проблемы. Если у вас есть желание изучить проблему глубже – топик легко гуглится, не обессудьте.
Стандарт XML предусматривает использование DTD (document type definition). DTD даёт возможность использовать так называемые XML-сущности.
Синтаксис определения сущностей прост:
Получить значение сущности в дальнейшем можно следующим образом:
Нюанс состоит в том, что сущности могут раскрываться не только в строки (как в нашем случае — «Entity value»), но и в последовательности других сущностей. Например:
В итоге при раскрытии сущности ‘lol1’ мы получим строку следующего вида:
lollollollollollollollollollol
Можно пойти дальше и определить сущность ‘lol2’, раскрыв её уже через ‘lol1’:
Тогда при раскрытии одной лишь сущности ‘lol2’ мы получим следующий выхлоп:
lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollol
Погрузимся на уровень ниже и определим сущность ‘lol3’?
Выхлоп при её раскрытии:
lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol lollollollollollollollollollollollollollollollollollollollollollollollol .
Собственно, сгенерированный по такому принципу XML-файл мы и использовали в начале статьи. Думаю, теперь понятно, откуда название «billion laughs». Получается, что если XML-парсер настроен неправильно (обрабатывает DTD и не имеет ограничений на максимальный размер сущностей), то при обработке подобной ‘бомбы’ ничего хорошего не случится.
Если говорить про C#, уязвимый код проще всего продемонстрировать на примере типа XmlReader:
var pathToXmlBomb = @"D:\XMLBomb.xml"; XmlReaderSettings rs = new XmlReaderSettings() < DtdProcessing = DtdProcessing.Parse, MaxCharactersFromEntities = 0 >; using var reader = XmlReader.Create(File.OpenRead(pathToXmlBomb), rs); while (reader.Read())
Сконфигурировав экземпляр XmlReader подобным образом, вы как бы говорите злоумышленнику этим кодом: «Давай, подорви меня!».
- разрешена обработка DTD;
- снято ограничение на максимальное количество символов из сущностей, то есть разрастание файла никак не ограничено.
По умолчанию, кстати, обработка DTD сущностей запрещена: свойство DtdProcessing имеет значение Prohibit, а на максимальное количество символов из сущностей стоит ограничение (начиная с .NET Framework 4.5.2). Так что в современном .NET всё меньше возможностей прострелить себе ногу. Хотя при неаккуратном конфигурировании парсеров это всё ещё возможно.
Возвращаясь к Visual Studio 2022
Похоже, что в Visual Studio 2022 при копировании нашей XML бомбы сработали как раз оба условия:
- запустилась обработка DTD;
- не стояло никаких ограничений, из-за чего объём потребляемой памяти пробил потолок.
Если посмотреть, что происходит в процессе в это время, можно найти подтверждение нашим предположениям.

В списке потоков видно, что основной поток как раз обрабатывает XML. К слову, из-за этого повис весь GUI и IDE никак не реагировала на попытки потыкать её палочкой.
Если посмотреть call stack потока VS Main, можно увидеть, что он как раз занят обработкой DTD (исполняется метод ParseDtd).

В ходе экспериментов у меня возник вопрос: а зачем Visual Studio вообще запускает процессинг DTD, почему просто не отображает XML как есть? Ответ пришёл в ходе экспериментов с ‘XML-бомбочкой’ (суть та же, но нагрузка поменьше).
Похоже, всё дело в том, чтобы отображать в редакторе «на лету» возможные значения сущностей.

Небольшие значения обрабатываются успешно, но разрастание XML приводит к проблемам.
Конечно, такая проблема не могла обойтись без написания мной баг-репорта.
Заключение
Вот так неожиданным образом удалось посмотреть, как на практике могут выглядеть уязвимости к XML-бомбам. Самое интересное, что удалось пощупать это не на каком-то абстрактном примере, а на вполне знакомом и популярном приложении.
Мы планируем добавить поиск кода, уязвимого к проблемам обработки XML-файлов, в PVS-Studio 7.15. Если же интересно посмотреть, что анализатор умеет уже сейчас, предлагаю загрузить его и попробовать на своих проектах. 😉
Как всегда, приглашаю подписываться на мой Twitter, чтобы не пропустить ничего интересного.
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Vasiliev. How Visual Studio 2022 ate up 100 GB of memory and what XML bombs had to do with it.
сколько весит Microsoft Visual C# Express? для скачивания
Я Красавчег Мудрец (12406) Слышал только про visual studio express, но про отдельный си шарп экпресс не слышал. И даже енто уно 6 Гб весит или около того. У меня только один вопрос какую уйню они туда пихают что это все так весит!?
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.
Visual studio too heavy in size?
I’m a complete beginner to programming and was recommended Visual Studio for an IDE, however, the download size just for the C++ workload is wayy too big. (Literally 9.56 GB). I’m no expert but I really doubt that that’s the amount of space I need just for coding. Even game engines and editors take less space than this. What’s even more frustrating is that, for some reason, part of it HAS to be installed in C:/, which I’m reserving only for windows OS itself and is already low in space. Please help me.
Archived post. New comments cannot be posted and votes cannot be cast.
Locked post. New comments cannot be posted.
Сколько весит visual studio
Microsoft Windows 64bit English Language Operating System
Windows 10
Windows 11
Note: As of Sept. 30, 2020, Windows 7 SP1 (32/64-bit) or higher, Windows 8 (32/64-bit), Windows 8.1 (32/64-bit), and Windows 10 (32-bit) are no longer subject to warranty and we cannot guarantee that Clip Studio Paint will work correctly. If you have no choice but to use one of the above operating systems, please download the previous version of Clip Studio Paint here.
Intel and AMD CPUs with SSE2 support
GPU with support for OpenGL 2.1
2GB or more memory required, 8GB or more recommended
Note: The memory capacity and CPU performance required for operation depends on the size of the image and the number of layers to be created. In general, larger image sizes and more layers require more memory space and a faster CPU.
Note: Windows on ARM is not supported.
Wintab-compatible LCD Tablet or Tablet and stylus with
pen pressure sensitivity that support Windows Ink Platform
Wacom products recommended
At least 3GB of free storage space
XGA (1024×768) or higher required, WXGA (1280×768) or higher recommended
High color (16 bit, 65536 colors) or higher required
Scanner supporting TWAIN driver
Compatible with the above OS
An internet connection is required for some software functions and to verify the software license.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, IPV (ibisPaint work files)
EX/PRO: XPG (Illust Studio format), CPG (Comic Studio page file), SVG
EX: CST (ComicStudio work files), CSNF (Clip Studio storyboard files), PDF
3D data: FBX, LWO, LWS, OBJ, GLTF, GLB, VRM, C2FR/C2FC (Celsys Character Format), 6KT, 6KH, PEP, CS3C (Clip Studio Character Format), CS3O (Clip Studio Object Format), CS3S (Clip Studio Background Format)
Video: AVI, MOV, MP4
Audio: WAV, MP3, Ogg
EX: XDTS Format (Digital Time Sheet Information)
Note: Compressed WAV format not supported.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB
EX/PRO: SVG
EX: MOBI (Kindle format), EPUB, PDF, OpenToonz scene files
Video:AVI, animated GIF, MP4
Audio:WAV, Ogg
EX: XDTS Format (Digital Time Sheet Information), CSV (Stylos CSV)
You can use the trial version to test compatibility with your computer and peripherals. We do not support computers and peripherals that do not have a manufacturer’s warranty, or that operate in a virtual environment.
Clip Studio Paint Ver. 2 for macOS
macOS (English)
12
13
14
Note: Please follow Apple’s guidelines here to set up your iCloud Drive.
Note: macOS Yosemite (10.10), El Capitan (10.11), Sierra (10.12), High Sierra (10.13), Mojave (10.14), Catalina (10.15), and Big Sur (11) are no longer subject to warranty and, we cannot guarantee that Clip Studio Paint will work correctly (Updated: 9/30/2020, 9/28/2021, 9/28/2022 and 9/26/2023). If you have no choice but to use one of the above operating systems, please download the previous version of Clip Studio Paint here.
Macs powered by Apple M series chips or Intel CPUs with the below specifications
OpenGL 2.1 compatible GPU
2GB or more memory required, 8GB or more recommended
*The memory and CPU performance required for operation depends on the image size and number of layers that the image to be created is comprised of. In general, larger image sizes and more layers require more memory space and a faster CPU.
A tablet and stylus with pen pressure sensitivity
As recommended by Wacom
At least 3GB of free storage space
XGA (1024 x 768) or higher required, WXGA (1280 x 768) or higher recommended
High color (16-bit, 65,536 colors) or better required.
Scanner supporting ICA driver
Compatible with the above OS
An internet connection is required for some software functions and to verify the software license.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, IPV (ibisPaint Artwork File)
EX/PRO: SVG
EX: CSNF (Clip Studio storyboard files), PDF
3D data: FBX, LWO, LWS, OBJ, GLTF, GLB, VRM, C2FR/C2FC (Celsys Character Format), 6KT, 6KH, PEP, CS3C (Clip Studio Character Format), CS3O (Clip Studio Object Format), CS3S (Clip Studio Background Format)
Audio: WAV, MP3, Ogg
Note: Compressed WAV is not supported.
EX: Timesheet: XDTS (Digital Time Sheet Information)
*The following formats are not supported by Intel Macs.
EX/PRO: XPG (IllustStudio format), CPG (ComicStudio page file)
EX: CST (ComicStudio work file)
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB
EX/PRO: SVG
EX: MOBI (Kindle format), EPUB, PDF, OpenToonz scene files
Audio: WAV, Ogg
EX: Timesheet: XDTS (Digital Time Sheet Information), CSV (Stylos CSV)
You can use the trial version to see if the product works well on your computer and peripherals. We do not support computers and peripherals that do not have a manufacturer’s warranty, or that operate in a virtual environment.
Clip Studio Paint for iPad
iPadOS 16
iPadOS 17
2GB or more of memory required, 4GB or more recommended
10.5 inches or larger display recommended
Apple Pencil (1st generation)
Apple Pencil (2nd generation)
At least 6GB of free storage space
An Internet connection is required to verify the software and make purchases.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, SVG, IPV (ibisPaint work files)
EX: CSNF (Clip Studio storyboard files), PDF
3D data: FBX, LWO, LWS, OBJ, GLTF, GLB, VRM, CS3C (Clip Studio Character Format), CS3O (Clip Studio Object Format), CS3S (Clip Studio Background Format)
Audio: WAV, MP3, Ogg
EX: XDTS Format (Digital Time Sheet Information)
Note: Compressed WAV format not supported.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, SVG
EX: EPUB, PDF
Video: MOV, animated GIF, MP4
Audio: WAV, Ogg
EX: XDTS Format (Digital Time Sheet Information), CSV (Stylos CSV)
Clip Studio Paint for iPhone
2GB or more of memory required, 4GB or more recommended
5.5 inches or larger display recommended
Note: On models that support 3D Touch, you can draw pressure-sensitive lines with your finger.
At least 6GB of free storage space
An Internet connection is required to verify the software and make purchases.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, SVG, IPV (ibisPaint work files)
EX: CSNF (Clip Studio storyboard files), PDF
3D data: FBX, LWO, LWS, OBJ, GLTF, GLB, VRM, CS3C (Clip Studio Character Format), CS3O (Clip Studio Object Format), CS3S (Clip Studio Background Format)
Audio: WAV, MP3, Ogg
EX: XDTS Format (Digital Time Sheet Information)
Note: Compressed WAV format not supported.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, SVG
EX: EPUB, PDF
Video: MOV, animated GIF, MP4
Audio: WAV, Ogg
EX: XDTS Format (Digital Time Sheet Information), CSV (Stylos CSV)
Clip Studio Paint for Galaxy
Android 11 or later (ARM64)
Smartphones:
・3GB or more of memory required, 6GB or more recommended
・6″ or larger display size is recommended
Tablets:
・3GB or more of memory required, 6GB or more recommended
・10.4″ or larger display size is recommended
Samsung Galaxy S Pen
Wacom Intuos, Wacom One
Note: For information on how to connect to Wacom products, see the Wacom website.
At least 6GB of free storage space
An Internet connection is required to verify the software and make purchases.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, SVG, IPV (ibisPaint work files)
EX: CSNF (Clip Studio storyboard files), PDF
3D data: LWO, LWS, OBJ, GLTF, GLB, VRM, CS3C (Clip Studio Character Format), CS3O (Clip Studio Object Format), CS3S (Clip Studio Background Format)
Audio: WAV, MP3, Ogg
EX: XDTS Format (Digital Time Sheet Information)
Note: Compressed WAV format not supported.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, SVG
EX: EPUB, PDF
Video: Animated GIF, MP4
Audio: WAV, Ogg
EX: XDTS Format (Digital Time Sheet Information), CSV (Stylos CSV)
Clip Studio Paint for Android
Android 11 or later (ARM32/ARM64)
HarmonyOS / EMUI compatible with Android 11 or later (ARM64)
Smartphones:
・3GB or more of memory required, 6GB or more recommended,
・6″ or larger display recommended
Tablets:
・3GB or more of memory required, 6GB or more recommended,
・10.4″ or larger display recommended
The following types of stylus pens have been tested to work with devices that support pressure-sensitive stylus pens.
・ Samsung Galaxy S Pen
・ HUAWEI M-Pencil
・ Wacom Intuos, Wacom One
Note: For guidance on how to connect your Wacom product, please refer to Wacom’s website.
At least 6GB of free storage space
An Internet connection is required to verify the software and make purchases
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, IPV (ibisPaint work files)
EX: CSNF (Clip Studio storyboard file), PDF
3D data: LWO, LWS, OBJ, GLTF, GLB, VRM, CS3C (Clip Studio Character Format), CS3O (Clip Studio Object Format), CS3S (Clip Studio Background Format)
Audio: WAV, MP3, Ogg
*Compressed WAV format not supported.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, SVG
EX: EPUB, PDF
Video: Animated GIF, MP4
Audio: WAV, Ogg
EX: Timesheet: XDTS (Digital Time Sheet Information), CSV (Stylos CSV)
Clip Studio Paint for Chromebook
ChromeOS compatible with Android 11 or later (ARM32 / x86 / x86_64)
4GB or more of memory required, 8GB or more recommended
WXGA (1280×768) or higher display recommended
We have confirmed that the following stylus pens have been tested to work with devices that support pressure-sensitive stylus pens.
Note: Stylus pens that are described as «built-in» or «compatible» have been verified only on their target devices.
USI
・ Lenovo USI pen
・ HP Rechargeable USI Pen
EMR
・ Wacom EMR stylus (Built-in stylus for Acer Chromebook Spin 512)
・ Galaxy S pen (compatible with Galaxy Chromebook)
AES
・ DELL AES pen (PN579X)
・ Pixel Book Pen
At least 6GB of free storage space
An Internet connection is required to verify the software and make purchases
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, IPV (ibisPaint work files)
EX: CSNF (Clip Studio storyboard file), PDF
3D data: LWO, LWS, OBJ, GLTF, GLB, VRM, CS3C (Clip Studio Character Format), CS3O (Clip Studio Object Format), CS3S (Clip Studio Background Format)
Audio: WAV, MP3, Ogg
*Compressed WAV format not supported.
BMP, JPEG, TGA, PNG, TIFF, PSD, PSB, SVG
EX: EPUB, PDF
Video: Animated GIF, MP4
Audio: WAV, Ogg
EX: Timesheet: XDTS (Digital Time Sheet Information), CSV (Stylos CSV)
