Skip to content

Commit

Permalink
Bug 1497487 - Backport bug 767623 to BMO: Use HMAC to generate tokens…
Browse files Browse the repository at this point in the history
… and sensitive graph filenames
  • Loading branch information
dylanwh authored Oct 12, 2018
1 parent 871fc7d commit 706d114
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 16 deletions.
15 changes: 7 additions & 8 deletions Bugzilla/Token.pm
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ use Bugzilla::User;
use Date::Format;
use Date::Parse;
use File::Basename;
use Digest::MD5 qw(md5_hex);
use Digest::SHA qw(hmac_sha256_base64);
use Encode;
use JSON qw(encode_json decode_json);
Expand Down Expand Up @@ -254,15 +253,15 @@ sub issue_hash_token {
my $user_id = Bugzilla->user->id || remote_ip();

# The concatenated string is of the form
# token creation time + site-wide secret + user ID (either ID or remote IP) + data
my @args = ($time, Bugzilla->localconfig->{'site_wide_secret'}, $user_id, @$data);
# token creation time + user ID (either ID or remote IP) + data
my @args = ($time, $user_id, @$data);

my $token = join('*', @args);
# Wide characters cause md5_hex() to die.
if (Bugzilla->params->{'utf8'}) {
utf8::encode($token) if utf8::is_utf8($token);
}
$token = md5_hex($token);
# $token needs to be a byte string.
utf8::encode($token);
$token = hmac_sha256_base64($token, Bugzilla->localconfig->{'site_wide_secret'});
$token =~ s/\+/-/g;
$token =~ s/\//_/g;

# Prepend the token creation time, unencrypted, so that the token
# lifetime can be validated.
Expand Down
14 changes: 6 additions & 8 deletions reports.cgi
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use Bugzilla::Error;
use Bugzilla::Status;

use File::Basename;
use Digest::MD5 qw(md5_hex);
use Digest::SHA qw(hmac_sha256_base64);

# If we're using bug groups for products, we should apply those restrictions
# to viewing reports, as well. Time to check the login in that case.
Expand Down Expand Up @@ -90,14 +90,12 @@ else {
# Filenames must not be guessable as they can point to products
# you are not allowed to see. Also, different projects can have
# the same product names.
my $key = Bugzilla->localconfig->{'site_wide_secret'};
my $project = bz_locations()->{'project'} || '';
my $image_file = join(':', ($key, $project, $prod_id, @datasets));
# Wide characters cause md5_hex() to die.
if (Bugzilla->params->{'utf8'}) {
utf8::encode($image_file) if utf8::is_utf8($image_file);
}
$image_file = md5_hex($image_file) . '.png';
my $image_file = join(':', ($project, $prod_id, @datasets));
my $key = Bugzilla->localconfig->{'site_wide_secret'};
$image_file = hmac_sha256_base64($image_file, $key) . '.png';
$image_file =~ s/\+/-/g;
$image_file =~ s/\//_/g;
trick_taint($image_file);

if (! -e "$graph_dir/$image_file") {
Expand Down

0 comments on commit 706d114

Please sign in to comment.