- Процесс «Система и сжатая память» в Windows 10
- Особенности технологии «Сжатой памяти» в Windows 10
- Процесс «Система и сжатая память» сильно грузит компьютер
- Как отключить сжатую память в Windows 10
- Заключение
- Enable-MMAgent
- Syntax
- Description
- Examples
- Example 1: Enable application launch prefetching
- Parameters
- Чтение памяти чужого процесса через комбинирование памяти в Windows 10
Процесс «Система и сжатая память» в Windows 10
Функция сжатия оперативной памяти в Windows 10 предназначена для ускорения работы (отзывчивости) системы за счет хранения части страниц в оперативной памяти в сжатом виде. Тем самым достигается уменьшение количества обращений на чтение и запись страниц памяти из медленного (по сравнению с RAM) файла подкачки на жестком диске. Нужные данные извлекаются из более быстрой оперативной памяти быстрее, даже с учетом того, что на их сжатие/декомпрессию тратятся дополнительные ресурсы процессора.
Особенности технологии «Сжатой памяти» в Windows 10
Изначально поток, отвечающий за работу подсистемы сжатой памяти, находилась внутри процесса System, что не очень удобно с точки зрения диагностики. В Windows 10 1511 этот функционал был выделен в отдельный процесс — Система и сжатая память (System and compressed memory).
В Windows 10 Anniversary edition (1607) появился отдельный процесс Сжатая память (Memory Compression), скрытый от диспетчера задач. Получить информацию об этом процессе можно с помощью PowerShell командлета Get-Process:
Get-Process -Name «Memory Compression»
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
——- —— —— —— —— — — ————
0 0 2184 53104 1 810,95 2388 0 Memory Compression
Также информацию об использовании сжатой памяти системой можно получить с помощью диспетчера задач. Перейдите на вкладку Производительность (Performance), выберите раздел Память (Memory). Текущее значение использования сжатой памяти отображается в значении параметра Использование (сжатая). В моем примере используется 3 Гб памяти, из которой в сжатом виде хранится 230 Мб. Чтобы понять, какой объем данных получилось упаковать в сжатый блок, нужно навести мышкой на график Структура памяти:
Используется сжатой памяти (230 Мб). В сжатой памяти хранится примерно 1012 Мб данных, освобождая для системы 782 Мб памяти.
Как вы видите, уровень компрессии достигает почти 400%, так что экономия довольно большая.
В большинстве случаев, если компьютер работает нормально и на нем установлен достаточный объём оперативной памяти, процесс «Сжатой памяти» работает отлично и не требует никакого вмешательства.
Процесс «Система и сжатая память» сильно грузит компьютер
Но иногда случается, когда процесс «Система и сжатая память» начинает довольно сильно грузить процессор или жесткий диск компьютера (вплоть до 100%, это видно в диспетчере задач), или же занимаеть в памяти слишком много места. Компьютер, при этом, естественно, начинает сильно тормозить и подвисать.
Что делать в этом случае?
Я приведу 2 совета, которые должны помочь исправить проблему с высокой загрузкой системы процессом «Сжатая память».
- Отключите файл подкачки системы (опция Без файла подкачки), перезагрузите компьютер, включите файл подкачки (опция Автоматически выбирать размер файла подкачки) и еще раз перезагрузитесь.
- Если проблема высокой загрузки процессом «Сжатая память» возникает только при выходе из режима сна или гибернации (а после перезагрузки пропадает), попробуйте скачать и установить с сайта производителя последние версии драйверов для ваших дисковых контроллеров (ACPI/ AHCI / RAID / SCSI), дисков и видеокарты. После чего желательно отключить автоматическое обновление драйверов.
Если указанные манипуляции не помогли, можно попробовать отключить сжатую память.
Как отключить сжатую память в Windows 10
Если вы хотите проверить стабильность работы Windows 10 без использования функции «сжатой памяти», можно временно отключать эту функцию. Для этого, откройте консоль PowerShell с правами администратора. Проверим, включена ли сейчас опция «Сжатой памяти»:
Строка MemoryCompression : True указывает на то, что сжатая память включена.
Отключим сжатую память:
И перезагрузим компьютер
После загрузки проверьте, как ведет себя система. Если производительность улучшилась, можно оставить ОС в режиме с отключенным режимом сжатой памяти.
Чтобы включить MemoryCompression, выполните команду:
Заключение
Технология «Сжатой памяти» в Windows 10, как правило работает довольно эффективно и не требует никаких вмешательств. В том случае, если она вызывает проблемы на вашем компьютере, скорее всего у вас имеются некоторые проблемы с настройками системы, оборудованием или драйверами. В случае необходимости, функцию сжатия памяти можно совсем отключить.
В некоторых случаях пользователям для исправления проблемы со сжатой памятью рекомендуют:
- отключить службу SuperFetch (services.msc -> SuperFetch -> тип запуска Отключена)
- Отключит задание обслуживания системы в планировщике RunFullMemoryDiagnosticEntry (Task Scheduler -> Библиотека планировщика -> Microsoft -> Windows — > MemoryDiagnostic -> RunFullMemoryDiagnosticEntry ->Отключить)
В некоторых случаях эти советы помогают избавится от чрезмерной нагрузки на компьютер со стороны процесса «Сжатая память», но при этом отключаются базовые подсистемы оптимизации производительности Windows, что может негативно сказаться на других аспектах производительности системы.
Enable-MMAgent
Enables application launch prefetching, operation recorder API functionality, page combining, and application prelaunch.
Syntax
Description
The Enable-MMAgent cmdlet enables any or all of the following features:
- Application launch prefetching
- Operation recorder API functionality
- Page combining
- Application prelaunching
Specify the ApplicationLaunchPrefetching parameter to help improve application startup performance. Application launch prefetching causes the memory manager agent to monitor the data and code that applications access. The memory management agent then uses that information to preload the data and code into physical memory for subsequent startups.
Specify the ApplicationPreLaunch parameter to help improve application startup performance. Application prelaunch can speculatively launch applications that the user is likely to use in the near future, thus reducing application switch time.
Specify the OperationAPI parameter to help speed up operations that repeatedly access the same file data. Enabling this feature exposes the Windows prefetching mechanism as a public interface.
Specify the PageCombining parameter to help reduce the physical memory that the operating system uses. Page combining causes the memory manager to periodically combine pages in physical memory that have identical content.
Examples
Example 1: Enable application launch prefetching
This command enables application launch prefetching on the local computer.
Parameters
Indicates that the cmdlet enables application launch prefetching.
If you do not specify this parameter, application launch prefetching remains in its current state, either enabled or disabled.
Type: | SwitchParameter |
Aliases: | alp |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Indicates that the cmdlet enables application prelaunch.
If you do not specify this parameter, application prelaunch remains in its current state, either enabled or disabled.
Type: | SwitchParameter |
Aliases: | apl |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Runs the cmdlet as a background job. Use this parameter to run commands that take a long time to complete.
The cmdlet immediately returns an object that represents the job and then displays the command prompt. You can continue to work in the session while the job completes. To manage the job, use the *-Job cmdlets. To get the job results, use the Receive-Job cmdlet.
For more information about Windows PowerShell background jobs, see about_Jobs.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Runs the cmdlet in a remote session or on a remote computer. Enter a computer name or a session object, such as the output of a New-CimSession or Get-CimSession cmdlet. The default is the current session on the local computer.
Type: | CimSession [ ] |
Aliases: | Session |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Indicates that this cmdlet uses memory compression.
Type: | SwitchParameter |
Aliases: | mc |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Indicates that the cmdlet enables operation recorder API functionality.
If you do not specify this parameter, operation recorder API functionality remains in its current state, either enabled or disabled.
For more information about the Operation Recorder API, seeOperation Recorder on MSDN.
Type: | SwitchParameter |
Aliases: | oa |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Indicates that the cmdlet enables page combining.
If you do not specify this parameter, page combining remains in its current state, either enabled or disabled.
Type: | SwitchParameter |
Aliases: | pc |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Specifies the maximum number of concurrent operations that can be established to run the cmdlet. If this parameter is omitted or a value of 0 is entered, then Windows PowerShell® calculates an optimum throttle limit for the cmdlet based on the number of CIM cmdlets that are running on the computer. The throttle limit applies only to the current cmdlet, not to the session or to the computer.
Чтение памяти чужого процесса через комбинирование памяти в Windows 10
Сразу скажу, что всё не так страшно, как звучит, и вы не сможете взять и прочитать память абсолютно любого взятого процесса в системе. По крайней мере, без некоторых предусловий. Основная уязвимость уже практически полностью прикрыта. Поэтому пост скорее предлагается в качестве исторической справки и для общего развития. Плюс, исходя из информации, которой я располагаю, никто пока не описывал такой способ эксплуатации, который предложу я.
Начну с того, что в Microsoft были уведомлены об этой проблеме ещё года полтора назад. В ответ мне сообщили, что уязвимость в большей степени уже закрыта, и что я могу опубликовать свои исследования.
Итак, приступим. В Windows 8.1 и в Windows 10 в какой-то момент времени появилась такая фича, как комбинирование памяти (memory combining или page combining, хорошо описана в книге Windows Internals, 7 издание, 1 часть). Суть её достаточно проста: операционная система раз в 15 минут ищет в физической памяти страницы с одинаковым содержимым и объединяет их в одну с целью экономии оперативной памяти. Те процессы, которые владели одинаковыми страницами, получают ссылки на новую общую страницу с атрибутом «только для чтения» и «копирования при записи» (read-only и copy-on-write). Если какой-то из процессов изменяет свою страницу, система при возникновении соответствующего copy-on-write исключения её копирует и снова размещает в физической памяти, а процесс снова получает индивидуальную копию этой страницы.
На базе этой функциональности, которая некоторое время была включена по умолчанию, были разработаны совершенно потрясающие способы атаки на систему. Советую прочитать соответствующий материал «Dedup Est Machina». В бумаге описан способ получения контроля над Microsoft Edge, а также чтения приватного содержимое памяти nginx. Обе атаки удалённые! Хоть уже и неактуальный, материал очень интересный и достаточно просто читается, несмотря на академический стиль, рекомендую.
Если быть кратким, суть атаки сводилась к следующему. После того, как система объединила одинаковые физические страницы в одну (а это происходило раз в 15 минут), и какой-то из процессов, владеющих одной из этих страниц, производил запись в неё, это занимало заметно большее время, чем обычно (потому что содержимое страницы сначала копируется из общей объединённой в приватную для этого процесса). Это время можно замерить и таким хитрым образом определить, использует ли ещё кто-то в системе такие же данные из этой страницы, что и наш процесс. Упрощённо, если в системе есть чья-то страница памяти, которая хранит интересующий нас пароль «123», мы можем создать большое количество страниц с содержимым вида «000», «001», «002», . «122», «123», «124», . «999». Далее мы через 15 минут, когда система выполнит комбинирование, попытаемся изменить содержимое каждой из этих страниц и, так как наша страница «123» была объединена с чужой страницей (их содержимое одинаковое), наш процесс увидит, что запись в неё занимает заметно большее время. Исходя из этого наш процесс сможет сделать вывод, что содержимое «123» есть в системе у кого-то ещё, а значит, это и есть интересующий нас пароль. Получается такой своеобразный брутфорс. Методика, описанная в бумаге по ссылке выше, конечно, значительно сложнее, там используется целая комбинация техник и атак для реализации полноценной утечки данных.
К счастью, Microsoft отключила комбинирование памяти, и проблема была решена. Осталось включенным комбинирование страниц, содержащих только нулевые байты, которое может выполняться в некоторых случаях, а это в целом безопасно. Только вот сам функционал из ядра не удалили и, более того, администратор может легко его включить. Для этого ранее можно было использовать недокументированную функцию NtSetSystemInformation (код есть в GitHub Windows Internals), но используемый класс SystemCombinePhysicalMemoryInformation был отключён или удалён из новых версий Windows 10 (или его индекс просто изменился).
Однако, есть даже более простой и документированный способ активировать комбинирование памяти: это команда PowerShell Enable-MMAgent -PageCombining , запущенная от имени администратора. Отключить комбинирование можно, соответственно, командой Disable-MMAgent -PageCombining , а получить текущее состояние настройки — командой Get-MMAgent . Тут есть небольшая пикантная особенность: администратор сервера может включить эту настройку с целью оптимизировать потребление памяти и, таким образом, открыть дыру в своей системе. На серверах часто работает много схожих виртуальных маших с более-менее одинаковым содержимым памяти, и такая функция вполне может иметь смысл с точки зрения администратора. В Microsoft, в свою очередь, нигде не упоминают о том, что включение этой настройки чревато большими проблемами. Вот, например, страница документации на Enable-MMAgent. Там ни слова нет о подводных камнях:
-PageCombining
Indicates that the cmdlet enables page combining.
If you do not specify this parameter, page combining remains in its current state, either enabled or disabled.
А вот ещё одна страница документации с сайта Microsoft, где memory combining упоминается в позитивном ключе:
Enabling page combining may reduce memory usage on servers which have a lot of private, pageable pages with identical contents. For example, servers running multiple instances of the same memory-intensive app, or a single app that works with highly repetitive data, might be good candidates to try page combining. The downside of enabling page combining is increased CPU usage.
Here are some examples of server roles where page combining is unlikely to give much benefit:
- File servers (most of the memory is consumed by file pages which are not private and therefore not combinable)
- Microsoft SQL Servers that are configured to use AWE or large pages (most of the memory is private but non-pageable)
Page combining is disabled by default but can be enabled by using the Enable-MMAgent Windows PowerShell cmdlet. Page combining was added in Windows Server 2012.
Тут нет ни слова о том, что page combining открывает дыры в системе. Единственный упомянутый недостаток — это увеличение загрузки процессора. Админ вполне может попробовать эту настройку у себя на серверах. Таким образом, документация Microsoft по этому вопросу оставляет желать лучшего. Я бы предложил им или вообще удалить эти разделы, или явно указать, что эта настройка устарела и всегда должна быть выключена.
Вы можете включить Page Combining также напрямую через WMI, выполнив следующую команду (тоже с правами администратора):