Skip to content

Commit

Permalink
Fixed RCE in git grep.
Browse files Browse the repository at this point in the history
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!
  • Loading branch information
klaussilveira committed Apr 24, 2018
1 parent 464d4db commit 87b8c26
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/Git/Repository.php
Original file line number Diff line number Diff line change
Expand Up @@ -322,15 +322,17 @@ public function searchTree($query, $branch)
return null;
}

$query = preg_replace('/(--?[A-Za-z0-9\-]+)/', '', $query);
$query = escapeshellarg($query);

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) {
return false;
}

$results = explode("\n", $results);
$searchResults = [];

foreach ($results as $result) {
if ($result == '') {
Expand Down
28 changes: 28 additions & 0 deletions tests/RepositoryTest.php
Original file line number Diff line number Diff line change
@@ -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');
}
}

0 comments on commit 87b8c26

Please sign in to comment.