Здравствуйте.
Давайте обсудим следующую ситуацию и ее решение.
Есть компьютерная игра, написанная на .net 7.
Для игры нужно сделать систему моддинга: моды должны разрабатываться на том же .net 7, упаковываться в какой-нибудь zip, в котором будут dll-ки и, например, графика.
Игра будет затягивать через рефлексию код из dll-ок и вызывать методы модов.
Теперь вопрос: как сделать так, чтобы код из внешней dll-ки не мог обращаться к файловой системе и к сети. в общем, как сделать так, чтобы код мог использовать все типовые средства .net, (типы, коллекции, Linq и т.д), но не мог навредить пользователю, например, зашифровав его файлы и потребовав выкуп.
Руслан, знаю только одну игру, где можно писать скрипты на C# - Space Engineers. При чем там возможно обращаться к игровым объектам через их внутренние имена (не знаю как правильно называется все это дело, мб, коллекции?) - к роторам, поршням и прочему. Поищите информацию об их мододелании. Скорее всего нужна некая прослойка в виде песочницы между языком и внутренними объектами игры.
Василий Банников, Если в коде есть упоминание хоть чего-то опасного - скрипт не запустится - да, забыл упомянуть про это. На счет неудобства программируемых блоков судить не могу, другого опыта нет.
Василий Банников, скорее наоборот, там whitelist. Из-за этого бывают проблемы, когда безобидная вещь из стандартной библиотеки не в белом списке, и приходится её велосипедить.
Vindicar, да да. В соседней ветке как раз упомянул, что для надёжности лучше белый список делать, а не чёрный.
Но я с таким не сталкивался, когда писал скрипты для SE
Я бы всё-таки посмотрел на пример популярных игр. Одна из таких широко распространённых в данный момент игр — Roblox. Там используется Luau, который с некоторых пор стал open source. Очень серьёзный подход к безопасности, достаточно простой язык (полностью совместимый с Lua), но с возможностью использования типов, линтером и т.п. Активно используем в своих проектах (не Roblox), рекомендую.
А что касается C#, то если говорить о широких массах мододелов, это сильно снизит их количество, по сравнению с тем же Lua (Luau), из-за необходимости более высокого уровня скиллов.
Дмитрий, Спасибо.
Вопрос все же про c# и .net
Но ваша информация тоже очень интересна.
тут сразу возникает вопрос практического применения - как запускать luau скрипты из c#, как организовать взаимодействие между хостом и скриптом, как обеспечить автодополнение (intellisence) и распознование типов хоста в среде разработки скриптов на luau.
Никак. Динамически загружаемая библиотека может уже в момент собственной загрузки исполнять любой код, который захочет.
Думаю, единственным вариантом здесь будет ручная модерация пользовательского кода, использование сертификатов для подписи библиотек и загрузка игрой исключительно подписанных сертификатом разработчика модификаций.
Василий Банников, увы, анализ кода по заранее прописанному перечню правил не даст защиты от злонамеренного пользователя. Даже сигнатурные проверки антивирусов спокойно обходятся, о чём уж говорить в самопальных реализациях...
Руслан, посмотри на mono Cecil - с ним можно анализировать сборку без её загрузки.
Записываешь у себя где-нибудь белый список полных имён методов, которые можно вызывать. Затем идёшь по каждой инструкции в сборке и проверяешь, что такой call разрешён.
Соответственно если там вызов нативного кода например, то не загружаешь её.
Василий Банников, любой белый список обходится свойством его конечности Руслан, твой ли головняк то неофициальное, что себе будут ставить юзеры? Если ты хочешь чтоб был твоим - вводи официальную модерацию исходного кода
Uno, Я вижу ситуацию таким образом:
1. Если нужно сделать что-то популярное, то это что-то должны быть простым и безопасным.
2. Я сам физически не могу сделать все, (и отмодерировать тоже)
3. поэтому и нужна система модов, чтобы любой желающий мог сделать свой мод.
4. Если мод у конечных пользователей будет вызывать проблемы, то пользователи не станут их себе устанавливать и вся затея с модами будет бесполезной.
ИТОГО: автор проекта должен заботиться об удобстве и безопасности.
Руслан, 4-Надуманная проблема.
Ни у кого в принципе с этим проблем нет.
То что пользователи не будут устанавливать моды - проблема самих пользователей.
В принципе можно вообще радикально поступить, как разработчики Minecraft Bedrock и вообще не давать возможность использовать язык общего назначения для модов, и пусть все становятся json-программистами
Василий Банников, проблема конечности белого списка в том, что ни один автор такого не будет настолько объективен, чтоб объективно оценивать его полноту. Самыми приближенными к объективности будут авторы языка, коим, автор вопроса, исходя из самого факта существования вопроса, как минимум, - не является.
Uno, можно просто опытным путём пополнять его. Давать заведомо безопасную сборку и смотреть к чему он обращается.
Не обязательно делать полный список, чтобы любой безопасный код проходил.
Достаточно чтобы проходило какое-то его подмножество, которое активно используется.
Василий Банников, да вся дисциплина информационной безопасности писана кровью. Точнее, деньгами.
Ну это если это важно.
Я к тому и веду, что неважно. Проще сделать открытые интерфейсы для мододелов и не брать на себя чужую ответственность за чужую же безопасность. Кто захочет - все равно найдет как исполнять нелегитимный код
Василий Банников, По по поводу WASM хотелось бы поподробней и поконкретней. сам в интернетах пока достаточной информации не нашел.
вопросы такие:
- как wasm-мод будет предоставлять те методы которые сможет вызывать wasm-хост?
- как wasm хост будет загружать wasm-сборку и вызывать его методы?
- как wasm-мод будет вызывать методы хоста?
Есть ли примеры кода?
Какие nuget-пакеты использовать?
- как wasm-мод будет предоставлять те методы которые сможет вызывать wasm-хост?
Wasm-модуль в этом плане похож на сишную библиотеку. В нём есть функции, которые могут быть экспортированы, которые можно вызвать извне.
- как wasm хост будет загружать wasm-сборку и вызывать его методы?
Примеры этого есть в документации к библиотеке с wasm-рантаймом
Вкратце модуль будет импортировать какие-то функции, а хост должен будет сказать своему линкеру, где взять реализации этих функций