Skip to content

Commit 5e44655

Browse files
authored
Tag values from CSP reports need to run through validation (#4001)
1 parent 4498a2a commit 5e44655

File tree

2 files changed

+83
-2
lines changed

2 files changed

+83
-2
lines changed

src/sentry/coreapi.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,6 @@ def validate_data(self, project, data):
732732
'project': project.id,
733733
'message': inst.get_message(),
734734
'culprit': inst.get_culprit(),
735-
'tags': inst.get_tags(),
736735
'release': meta.get('release'),
737736
inst.get_path(): inst.to_json(),
738737
# This is a bit weird, since we don't have nearly enough
@@ -759,6 +758,30 @@ def validate_data(self, project, data):
759758
'value': data['release'],
760759
})
761760
del data['release']
761+
762+
tags = []
763+
for k, v in inst.get_tags():
764+
if len(v) > MAX_TAG_VALUE_LENGTH:
765+
self.log.debug('Discarded invalid tag: %s=%s', k, v)
766+
data['errors'].append({
767+
'type': EventError.INVALID_DATA,
768+
'name': 'tags',
769+
'value': (k, v),
770+
})
771+
continue
772+
if not TagValue.is_valid_value(v):
773+
self.log.debug('Discard invalid tag value: %s', v)
774+
data['errors'].append({
775+
'type': EventError.INVALID_DATA,
776+
'name': 'tags',
777+
'value': (k, v),
778+
})
779+
continue
780+
tags.append((k, v))
781+
782+
if tags:
783+
data['tags'] = tags
784+
762785
return data
763786

764787

tests/sentry/coreapi/tests.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,10 @@ def test_validate_basic(self):
492492
assert result['errors'] == []
493493
assert 'message' in result
494494
assert 'culprit' in result
495-
assert 'tags' in result
495+
assert result['tags'] == [
496+
('effective-directive', 'img-src'),
497+
('blocked-uri', 'http://google.com'),
498+
]
496499
assert result['sentry.interfaces.User'] == {'ip_address': '69.69.69.69'}
497500
assert result['sentry.interfaces.Http'] == {
498501
'url': 'http://45.55.25.245:8123/csp',
@@ -506,3 +509,58 @@ def test_validate_basic(self):
506509
def test_validate_raises_invalid_interface(self):
507510
with self.assertRaises(APIForbidden):
508511
self.helper.validate_data(self.project, {})
512+
513+
def test_tags_out_of_bounds(self):
514+
report = {
515+
"document-uri": "http://45.55.25.245:8123/csp",
516+
"referrer": "http://example.com",
517+
"violated-directive": "img-src https://45.55.25.245:8123/",
518+
"effective-directive": "img-src",
519+
"original-policy": "default-src https://45.55.25.245:8123/; child-src https://45.55.25.245:8123/; connect-src https://45.55.25.245:8123/; font-src https://45.55.25.245:8123/; img-src https://45.55.25.245:8123/; media-src https://45.55.25.245:8123/; object-src https://45.55.25.245:8123/; script-src https://45.55.25.245:8123/; style-src https://45.55.25.245:8123/; form-action https://45.55.25.245:8123/; frame-ancestors 'none'; plugin-types 'none'; report-uri http://45.55.25.245:8123/csp-report?os=OS%20X&device=&browser_version=43.0&browser=chrome&os_version=Lion",
520+
"blocked-uri": "v" * 201,
521+
"status-code": 200,
522+
"_meta": {
523+
"release": "abc123",
524+
}
525+
}
526+
result = self.helper.validate_data(self.project, report)
527+
assert result['tags'] == [
528+
('effective-directive', 'img-src'),
529+
]
530+
assert len(result['errors']) == 1
531+
532+
def test_tag_value(self):
533+
report = {
534+
"document-uri": "http://45.55.25.245:8123/csp",
535+
"referrer": "http://example.com",
536+
"violated-directive": "img-src https://45.55.25.245:8123/",
537+
"effective-directive": "img-src",
538+
"original-policy": "default-src https://45.55.25.245:8123/; child-src https://45.55.25.245:8123/; connect-src https://45.55.25.245:8123/; font-src https://45.55.25.245:8123/; img-src https://45.55.25.245:8123/; media-src https://45.55.25.245:8123/; object-src https://45.55.25.245:8123/; script-src https://45.55.25.245:8123/; style-src https://45.55.25.245:8123/; form-action https://45.55.25.245:8123/; frame-ancestors 'none'; plugin-types 'none'; report-uri http://45.55.25.245:8123/csp-report?os=OS%20X&device=&browser_version=43.0&browser=chrome&os_version=Lion",
539+
"blocked-uri": "http://google.com\n",
540+
"status-code": 200,
541+
"_meta": {
542+
"release": "abc123",
543+
}
544+
}
545+
result = self.helper.validate_data(self.project, report)
546+
assert result['tags'] == [
547+
('effective-directive', 'img-src'),
548+
]
549+
assert len(result['errors']) == 1
550+
551+
def test_no_tags(self):
552+
report = {
553+
"document-uri": "http://45.55.25.245:8123/csp",
554+
"referrer": "http://example.com",
555+
"violated-directive": "img-src https://45.55.25.245:8123/",
556+
"effective-directive": "v" * 201,
557+
"original-policy": "default-src https://45.55.25.245:8123/; child-src https://45.55.25.245:8123/; connect-src https://45.55.25.245:8123/; font-src https://45.55.25.245:8123/; img-src https://45.55.25.245:8123/; media-src https://45.55.25.245:8123/; object-src https://45.55.25.245:8123/; script-src https://45.55.25.245:8123/; style-src https://45.55.25.245:8123/; form-action https://45.55.25.245:8123/; frame-ancestors 'none'; plugin-types 'none'; report-uri http://45.55.25.245:8123/csp-report?os=OS%20X&device=&browser_version=43.0&browser=chrome&os_version=Lion",
558+
"blocked-uri": "http://google.com\n",
559+
"status-code": 200,
560+
"_meta": {
561+
"release": "abc123",
562+
}
563+
}
564+
result = self.helper.validate_data(self.project, report)
565+
assert 'tags' not in result
566+
assert len(result['errors']) == 2

0 commit comments

Comments
 (0)