Здравствуйте, vayerx, Вы писали:
V>случается, редко, конечно, но все же встречается крохотная часть кода, посвещенная непосредственно предметной области. вы же не будете утверждать, что весь софт пишется исключительно для веба или "около веба"? примеры с калькулятором кажутся неубедительными и по их поводу я уже говорил выше.
Утверждать они не будут, но они перенсят принципы, хорошие для веба, на все остальное ПО и упорно пытаются их выдать за фундаментальные принципы. Может, сознательно, а скорее подсознательно. Их так учили
With best regards
Pavel Dvorkin
Re[13]: Сказка о циничном ученом, простреленных ногах разраб
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Утверждать они не будут, но они перенсят принципы, хорошие для веба, на все остальное ПО и упорно пытаются их выдать за фундаментальные принципы. Может, сознательно, а скорее подсознательно. Их так учили
Давно игровые приставки стали вебом?
лэт ми спик фром май харт
Re[7]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Здравствуйте, gandjustas, Вы писали:
E>>>Код сборки до запуска лежит на диске? Может ли он может быть изменен на диске и последующим исправлением всех контрольных сумм и пр.? G>>Если имеет strong name, то нет. Разве что у злоумышленника будет доступ к ключу, которым подписали исходную сборку.
KV>Если бы... http://www.codeproject.com/KB/security/StrongNameRemove20.aspx
Только ссылки на такую сборку поломаются. Также есть CAS, с помощью которого можно запретить действия для неподписанных сборок.
Re[6]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, Sinclair, Вы писали:
E>>Код сборки до запуска лежит на диске? Может ли он может быть изменен на диске и последующим исправлением всех контрольных сумм и пр.? S>Кода сборки до запуска не существует. На диске лежит промежуточный код; при его компиляции происходит верификация, которая гарантирует отсутствие таких вещей, как исполнение "неожиданного" кода.
"Неожиданный" код -- это какой?
Например, кто-то написал на C# код, который с помощью .NET Framework передает по HTTP какую-то информацию на удаленный хост. Затем получил для этого кода IL, внедрил его в какую-нибудь сборку с подделкой всех реквизитов сборки. Что позволит не верифицировать этот код?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Pavel Dvorkin, Вы писали:
S>Вот, к примеру, singularity. Там в принципе невозможна ни модификация кода, ни исполнение данных.
В принципе ? Даже если будет написан некий продукт, который перепишет загрузочный сектор, загрузит себя, захватит контроль над защищенным режимом и запустит ее из под себя ? Ну вроде SoftIce для 9x, который и загружал Windows. Технически — да, очень сложно, может, практически нереализуемо, но в принципе ?
А скорее всего такой продукт существует. У авторов этой singularity. Им-то как-то ее отлаживать надо ? . Управляемый код в ней управляется другим управляемым кодом, ладно, а тот в свою очередь ? В конечном счете должен же быть неуправляемый код — процессор-то пока неуправляемый!
А может, пора управляемые процессоры делать ? Только вот кто ими управлять будет ?
With best regards
Pavel Dvorkin
Re[13]: Сказка о циничном ученом, простреленных ногах разраб
Здравствуйте, prVovik, Вы писали:
V>Казалось бы, "железный" софт, с внешним миром контактирует по минимуму, это вам не веб-сервер какой, ан вот оно как вышло. V>P.S.: Если кто-то найдёт в моем сообщении призыв писать софт для Xbox на .NET'e, пусть сходит к офтальмологу.
и что с того? теперь обжегшись на молоке дуть на воду? ради чего бронировать все подряд?
Re[5]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Смотрим на листбокс и обнаруживаем там нечто интересное
L>А теперь то же самое — для WPF-приложения
То же самое — не получится, окна там нет. Но можно другое.
Делаем WPF приложение. Ничего не меняем. Заголовок окна "Window1".
Программа на С++
int _tmain(int argc, _TCHAR* argv[])
{
HWND hFormWnd = FindWindow(NULL, L"Window1");
SetWindowText(hFormWnd,L"What's matter with my caption ?");
return 0;
}
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А скорее всего такой продукт существует. У авторов этой singularity. Им-то как-то ее отлаживать надо ? . Управляемый код в ней управляется другим управляемым кодом, ладно, а тот в свою очередь ? В конечном счете должен же быть неуправляемый код — процессор-то пока неуправляемый!
Достаточно подробное описание архитектуры сингулярити в этом форуме уже было. Совершенно нетрудно найти и соответствующую статью, в которой подробно написано, какой объем кода ядра верифицируется вручную.
"Нуправляемый в конечном счете" код получается из управляемого, после верификации и компиляции. PD>А может, пора управляемые процессоры делать ? Только вот кто ими управлять будет ?
Как раз наоборот: практика показала, что управляемые процессоры катастрофически неэффективны. Сингулярити показывает офигительный отрыв в производительности от линуксов и винды на том же железе, как раз за счет отказа от тех фич процессора, которые относятся к "управляемости".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Ну слава Всевышнему, хоть один уловил истинную тему этого текста. Я уж думал, мне тут плясать и петь песни придется, чтобы обратить внимание на эту проблему.
KV>Ок, зайдем издалека: что именно НАДО разработчикам-не-ламерам? Чтобы написанный ими код работал в соответствии с поставленной задачей?
Я другую "сказку" расскажу немного не в тему. Пару лет назад в С# стандартная сортировка валилась (вырождалась в квадратичную) примитивной пирамидой (1,2,...,n,...,2,1). И все приложения, позволяющие относительно большой пользовательский ввод (импорт таблицы, например) с последующей возможностью сортировки очень просто уходили в ночь. Это, конечно, не сильно большая проблема, но о ней, похоже, тоже мало кто когда-нибудь задумывается.
Re[7]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Sinclair, Вы писали:
E>>>Код сборки до запуска лежит на диске? Может ли он может быть изменен на диске и последующим исправлением всех контрольных сумм и пр.? S>>Кода сборки до запуска не существует. На диске лежит промежуточный код; при его компиляции происходит верификация, которая гарантирует отсутствие таких вещей, как исполнение "неожиданного" кода.
E>"Неожиданный" код -- это какой?
E>Например, кто-то написал на C# код, который с помощью .NET Framework передает по HTTP какую-то информацию на удаленный хост. Затем получил для этого кода IL, внедрил его в какую-нибудь сборку с подделкой всех реквизитов сборки. Что позволит не верифицировать этот код?
Здравствуйте, Pavel Dvorkin, Вы писали: PD>В принципе ?
Да, в принципе. PD>Даже если будет написан некий продукт, который перепишет загрузочный сектор, загрузит себя, захватит контроль над защищенным режимом и запустит ее из под себя ?
Ничего не получится. В том смысле, что код, который захочет что-то записать в загрузочный сектор, должен это будет сделать при помощи обращения к коду ОС.
Естественно, при этом будет произведена проверка привилегий. Стороннему коду получить привилегию на модификацию загрузочного сектора случайным образом невозможно.
Исполнить себя в контексте чужого процесса тоже нельзя — в принципе. Поэтому система всегда знает, что за код исполняется, откуда он такой взялся, и что ему можно, а что нельзя.
Выдать привилегии этому коду сможет только администратор, и только через стандартные средства.
В неуправляемой среде такой контроль невозможен: слишком низкая гранулярность безопасности. Вот простой пример: пишем ActiveX для использования в веб-странице. Естественно, експлорер оборудован дурацкой троекратной спрашивалкой: сначала нужно согласиться поставить, потом согласиться использовать, потом ткнуть в активикс чтобы согласиться активировать.
Всех это, естественно, парит. Ок, берем и пишем в инсталлере тривиальный код, который правит реестр так, как будто "пользователь уже всё активировал". Делов-то!
Ну вроде SoftIce для 9x, который и загружал Windows. Технически — да, очень сложно, может, практически нереализуемо, но в принципе ?
Как раз технически это очень несложно и практически реализуемо. К сожалению, принцип не даст такую штуку сделать.
Естественно, принцип можно обойти путем извлечения диска из компьютера и ручной замены загрузочного сектора. Но, к примеру, сделать то же самое через интернет в принципе не выйдет.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, eao197, Вы писали: E>Например, кто-то написал на C# код, который с помощью .NET Framework передает по HTTP какую-то информацию на удаленный хост. Затем получил для этого кода IL, внедрил его в какую-нибудь сборку с подделкой всех реквизитов сборки. Что позволит не верифицировать этот код?
Верификация ничего не говорит о "злонамеренности" кода. Верификация ганартирует, что написанный на дотнете код, который работает со строкой, принятой по сети, невозможно обманом заставить проинтерпретировать содержимое этой строки как инструкции процессора и выполнить их.
То есть верификация позволяет спастись от кода, который маскируется под данные. Есть детерминированное количество способов получить указатель для косвенного вызова, и ни один из них не позволяет передать управление "в воздух".
А вот для решения приведенной тобой проблемы работает Code Access Security. Грубо говоря, мало сгенерировать такую сборку, нужно убедить систему ее исполнить.
Подпись майкрософт ты под ней зафорджить не сможешь; в низком уровне Trust у тебя такой код просто не сможет выполниться, ему скажут "нет прав отправлять информацию на удаленный хост". Всё.
В неуправляемом коде аналог CAS получить крайне сложно, потому что там есть богатые возможности по маскировке происхождения кода. Грубо говоря, любая DLL, загруженная в процесс, выполняется под правами этого процесса. Упс.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, Sinclair, Вы писали:
S>Кода сборки до запуска не существует. На диске лежит промежуточный код; при его компиляции происходит верификация, которая гарантирует отсутствие таких вещей, как исполнение "неожиданного" кода.
PD>>Даже если будет написан некий продукт, который перепишет загрузочный сектор, загрузит себя, захватит контроль над защищенным режимом и запустит ее из под себя ? S>Ничего не получится. В том смысле, что код, который захочет что-то записать в загрузочный сектор, должен это будет сделать при помощи обращения к коду ОС.
загрузка с зараженного cd/dvd/usb-disk в наше время маловероятна. сетевая загрузка с зараженного компьютера — уже чуть более.
а если подменяется дистрибутив? тогда код установки будет выполнен с правами рута.
Re[7]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, hattab, Вы писали: S>>Кода сборки до запуска не существует. На диске лежит промежуточный код; при его компиляции происходит верификация, которая гарантирует отсутствие таких вещей, как исполнение "неожиданного" кода. H>А как же native images от ngen?
Если честно, то я не в курсе, чем именно они защищены от подделки. Но есть мнение, что перед использованием пронгененых сборок рантайм проверяет реквизиты сборки в GAC.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Достаточно подробное описание архитектуры сингулярити в этом форуме уже было. Совершенно нетрудно найти и соответствующую статью, в которой подробно написано, какой объем кода ядра верифицируется вручную.
Неважно какой именно, ты же о принципе говорил.
With best regards
Pavel Dvorkin
Re[8]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, Sinclair, Вы писали:
S>Верификация ничего не говорит о "злонамеренности" кода. Верификация ганартирует, что написанный на дотнете код, который работает со строкой, принятой по сети, невозможно обманом заставить проинтерпретировать содержимое этой строки как инструкции процессора и выполнить их.
Как я понимаю, уверенность в этом уже была скомпромитирована.
S>А вот для решения приведенной тобой проблемы работает Code Access Security. Грубо говоря, мало сгенерировать такую сборку, нужно убедить систему ее исполнить. S>Подпись майкрософт ты под ней зафорджить не сможешь; в низком уровне Trust у тебя такой код просто не сможет выполниться, ему скажут "нет прав отправлять информацию на удаленный хост". Всё.
Насколько я понимаю, права назначаются людьми. Которые могут ошибаться. Если уж люди не меняют пароли на учетную запись администратора, то появится либо возможность переназначить права определенным сборкам, либо в самой сборке потребовать права так, чтобы их было достаточно для выполнения нужных действий.
Достаточно вспомнить, что вирус Морриса забирался на удаленные машины через дырочку в скомпилированной в отладочной версии sendmail -- через эту дыру на удаленной машине запускался потоковый текстовый редактор, в него загонялся исходный текст головной программы вируса, после чего этот текст транслировался в исполнимый файл. Так что, если есть какая-то человеческая ошибка при конфигурировании системы, ей обязательно воспользуются.
S>В неуправляемом коде аналог CAS получить крайне сложно, потому что там есть богатые возможности по маскировке происхождения кода. Грубо говоря, любая DLL, загруженная в процесс, выполняется под правами этого процесса. Упс.
Да ладно, история вирусов под MS-DOS прекрасно показывает, что вирусы могут жить внутри exe-ников, даже не увеличивая их размер. Так что не обязательно подменять DLL, вредоносный код можно внедрить прямо в EXE, если есть доступ к файловой системе.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: Сказка о циничном ученом, простреленных ногах разрабо
Здравствуйте, Sinclair, Вы писали:
S>>>Кода сборки до запуска не существует. На диске лежит промежуточный код; при его компиляции происходит верификация, которая гарантирует отсутствие таких вещей, как исполнение "неожиданного" кода. H>>А как же native images от ngen? S>Если честно, то я не в курсе, чем именно они защищены от подделки. Но есть мнение, что перед использованием пронгененых сборок рантайм проверяет реквизиты сборки в GAC.
Мне стало интересно. Редактором FAR'а открыл сборку C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\PaintDotNet.SystemL#\7aeec1a31a19054398c9ab08460a0780\PaintDotNet.SystemLayer.ni.dll и от балды поменял один байт. После чего запустил Paint.NET, который открылся, как ни в чем не бывало (эту сборку он загрузил, я посмотрел ProcessExplorer'ом)