mirror of
https://github.com/klaussilveira/gitlist.git
synced 2025-11-17 19:20:56 +01:00
Fixed RCE in git grep.
A specific option in git grep could be added inside the pattern to be searched for, resulting in possible RCE. Thanks to Kacper Szurek (https://security.szurek.pl) for catching this one!
This commit is contained in:
@@ -322,15 +322,17 @@ class Repository extends BaseRepository
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$query = preg_replace('/(--?[A-Za-z0-9\-]+)/', '', $query);
|
||||||
$query = escapeshellarg($query);
|
$query = escapeshellarg($query);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$results = $this->getClient()->run($this, "grep -i --line-number {$query} $branch");
|
$results = $this->getClient()->run($this, "grep -i --line-number -- {$query} $branch");
|
||||||
} catch (\RuntimeException $e) {
|
} catch (\RuntimeException $e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$results = explode("\n", $results);
|
$results = explode("\n", $results);
|
||||||
|
$searchResults = [];
|
||||||
|
|
||||||
foreach ($results as $result) {
|
foreach ($results as $result) {
|
||||||
if ($result == '') {
|
if ($result == '') {
|
||||||
|
|||||||
28
tests/RepositoryTest.php
Normal file
28
tests/RepositoryTest.php
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use GitList\Git\Client;
|
||||||
|
use GitList\Git\Repository;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Prophecy\Argument;
|
||||||
|
|
||||||
|
class RepositoryTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testIsSanitizingSearchWithPager()
|
||||||
|
{
|
||||||
|
$client = $this->prophesize(Client::class);
|
||||||
|
$client->run(Argument::type(Repository::class), "grep -i --line-number -- '=sleep 5;' master")->shouldBeCalled();
|
||||||
|
|
||||||
|
$repository = new Repository('/tmp', $client->reveal());
|
||||||
|
$repository->searchTree('--open-files-in-pager=sleep 5;', 'master');
|
||||||
|
$repository->searchTree('-O=sleep 5;', 'master');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testIsSanitizingSearchWithAnyOption()
|
||||||
|
{
|
||||||
|
$client = $this->prophesize(Client::class);
|
||||||
|
$client->run(Argument::type(Repository::class), "grep -i --line-number -- 'foobar =bar;' foo")->shouldBeCalled();
|
||||||
|
|
||||||
|
$repository = new Repository('/tmp', $client->reveal());
|
||||||
|
$repository->searchTree('foobar --bar --foo=bar;', 'foo');
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user