LINUX.ORG.RU

Solaris, Linux освобождение ресурсов, которые использовал процесс.


0

0

Всем доброе время суток.

Возник такой вопрос. Допустим есть процесс, он завершается тем или иным способом, например, по KILL. Что происходит с памятью, которую занимал процесс? Есть ли какой-либо регламент в отношении очистки памяти, которую занимал процесс? Можно ли как-нибудь считать данные из этой памяти после смерти процесса?

Делается это не для разработки вирусов, а наоборот.

★★

>Допустим есть процесс, он завершается тем или иным способом, например, по KILL. Что происходит с памятью, которую занимал процесс?

Что может помешать ее размапить обратно в пул свободной памяти? И почему ОС не должна этого сделать?

Absurd ★★★
()
Ответ на: комментарий от Absurd

Если бы я знал ответы на твои вопросы, этой темы бы не было.

Просто для соответствия классу защищенности 1Г необходимо выполнение одного из требований РД Гостехкомиссии России: "должна осуществляться очистка (обнуление, обезличивание) освобождаемых областей оперативной памяти ЭВМ и внешних накопителей. Очистка осуществляется однократной произвольной записью в освобождаемую область памяти, ранее использованную для хранения защищаемых данных (файлов)".

Делается ли это в Solaris, Linux? И как это можно проверить?

Ian ★★
() автор топика
Ответ на: комментарий от true_admin

То есть в принципе, после смерти процесса, я могу сделать dump оперативной памяти и успеть найти в нем некие данные, с которыми работал процесс?

Ian ★★
() автор топика
Ответ на: комментарий от Absurd

ну ты отрыл труп. Я про такие винды уже лет шесть не слышал. Ты ещё 3.1 вспомни :)

> То есть в принципе, после смерти процесса, я могу сделать dump оперативной памяти и успеть найти в нем некие данные, с которыми работал процесс?

Скорее всего можешь. И в свопе можешь найти много чего. Можно это проверить через /proc/kcore.

true_admin ★★★★★
()
Ответ на: комментарий от Ian

>Делается ли это в Solaris, Linux?

Поскольку в освобожденной памяти могут храниться данные других пользователей, в т.ч root и группы администрирования, ядро должно ее занулять.

Absurd ★★★
()
Ответ на: комментарий от true_admin

>Я про такие винды уже лет шесть не слышал. Ты ещё 3.1 вспомни :)

Вплоть до XP основной домашней системой считалась 9x. Почти десять лет гиморроя.

Absurd ★★★
()

раз всякие МСВС соответствуют фстэк и прочему, то наверняка данная функциональность реализована, вот наверное alt так умеет, надо посмотреть на защищённые версии

>Можно ли как-нибудь считать данные из этой памяти после смерти процесса?


наверняка снова можно её под какие-нибудь виртуальные страницы подложить и почитать, что осталось

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

> наверняка снова можно её под какие-нибудь виртуальные страницы подложить и почитать, что осталось

Если честно, то я слабо представляю как это вообще можно сделать. Я могу попробовать как-нибудь из под root по id процесса вытянуть его данные, но как узнать в какой реальной памяти все это лежало после смерти процесса...

Ian ★★
() автор топика
Ответ на: комментарий от dimon555

> раз всякие МСВС соответствуют фстэк и прочему

Судя по содержимому /bin/uname фигня этот ваш МСВС.

nikolayd
()
Ответ на: комментарий от dimon555

Можно попробовать считать какие-нибудь данные процесса, потом убить его, сделать dump оперативной памяти, а потом поисать там сохраненные данные процесса? Или это бред?

Ian ★★
() автор топика
Ответ на: комментарий от Absurd

Это при sbrk она её занулит(могу ошибаться). А вот при выходе из программы я не уверен. Есть доки, но их лень читать.

true_admin ★★★★★
()
Ответ на: комментарий от Ian

> Если честно, то я слабо представляю как это вообще можно сделать. Я могу попробовать как-нибудь из под root по id процесса вытянуть его данные, но как узнать в какой реальной памяти все это лежало после смерти процесса...

Штатным способом нельзя, конечно же.

Подозреваю, что память если где и обнуляется, то в момент повторного выделения её. Можно проверить, заглянув в исходники. Заодно, если нужно, чтобы обнулялось, можно прямо туда и добавить.

const86 ★★★★★
()
Ответ на: комментарий от const86

А смотреть в исходниках куда?

Ian ★★
() автор топика

>Допустим есть процесс, он завершается тем или иным способом, например, по KILL.
вызввается системный вызов exit()

>Что происходит с памятью, которую занимал процесс?
функция do_exit() начинает вызывать другие функции и освобождать ресурсы занимаемые процессом. Если не изменяет склероз exit_mm() освобождает память.

>Можно ли как-нибудь считать данные из этой памяти после смерти процесса?
Наверное нужно хранить копию task_struct, ИМХО.

Boy_from_Jungle ★★★★
()

> Можно ли как-нибудь считать данные из этой памяти после смерти процесса?

Прямым способом - нет. Память сразу не обнуляется, поэтому в результате багов с отсутствием очистки свежевыделенной памяти или неправильным использованием copy_from/to_user данные могут течь в юзерспейс. Как правило, небольшими порциями в несколько байт, на то он и баг.

Если куда-то сертифицироваться надо, то патч, чистящий память убиенного, небольшой будет.

mv ★★★★★
()
Ответ на: комментарий от Ian

> То есть ядро память не заполнит нулями при освобождении?

С точки зрения использования машинных ресурсов это крайне непрактично. Памяти у процесса может быть гигабайты, их очистка займёт просто дофигища времени. С выносом полезных данных из кешей.

mv ★★★★★
()
Ответ на: комментарий от mv

Спасибо за конкретный ответ.

> Если куда-то сертифицироваться надо, то патч, чистящий память убиенного, небольшой будет.

У человека незнакомого с ядром, но знающего C - много времени займет?

Ian ★★
() автор топика
Ответ на: комментарий от mv

>Если куда-то сертифицироваться надо, то патч, чистящий память убиенного, небольшой будет.

Можно просто попробывать на освобождённую память после уничтожения процесса налаживать сразу get_zeroed_page

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Ian

> У человека незнакомого с ядром, но знающего C - много времени займет?

Если всё так строго, то можно попробовать grsecurity: http://www.grsecurity.net/features.php

Предполагаю, что фича "PaX: Physical memory sanitization to prevent forensics" - это как раз очистка юзанной памяти.

mv ★★★★★
()
Ответ на: комментарий от mv

Не настолько строго, но с нас время от времени спрашивают это идиотское соответствие 1Г.

Спасибо за ссылку, сейчас посмотрю.

Ian ★★
() автор топика
Ответ на: комментарий от Ian

Так точно, grsecurity-2.1.12-2.6.27.10-200812271347.patch.gz:/linux-2.6.27.10/mm/page_allo c.c.diff чистит память при освобождении.

> спрашивают это идиотское соответствие 1Г.


Ничего не идиотское. Нормальное требование, очевидный способ устранить утечки информации.

mv ★★★★★
()
Ответ на: комментарий от Ian

Я в гугле всю инфу находил. По работе памяти, вроде Ulrich Drepper много писал.

true_admin ★★★★★
()
Ответ на: комментарий от Ian

Ну вышеотмеченный патч наложи (только ifdef'ы убери), да ещё вот этот (определение sanitize_highmem), и будет тебе счастье: grsecurity-2.1.12-2.6.27.10-200812271347.patch.gz:/linux-2.6.27.10/include/linu x/highmem.h.diff

mv ★★★★★
()
Ответ на: комментарий от mv

> Ничего не идиотское. Нормальное требование, очевидный способ устранить утечки информации.

Интересно почему этого нет в ядре просто опцией? И как в данном случае ведет себя Windows XP?

Ian ★★
() автор топика
Ответ на: комментарий от Ian

> Интересно почему этого нет в ядре просто опцией?

Потому, что это накладно. Но если ты убедишь Линуса, что этот патч хотя бы в виде опции жизненно необходим, то будет тебе опция ;)

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.