Skip to content

Commit 738a0f8

Browse files
committed
Added Django trigger words and tests
- Reworded description of framework function parameter
1 parent efbdbd7 commit 738a0f8

File tree

4 files changed

+77
-3
lines changed

4 files changed

+77
-3
lines changed

example/vulnerable_code/django_XSS.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.shortcuts import render
2+
3+
4+
def xss1(request, param):
5+
return render(request, 'templates/xss.html', {'param': param})
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
sources:
2+
POST.get(
3+
GET.get(
4+
META.get(
5+
POST[
6+
GET[
7+
META[
8+
FILES[
9+
.data
10+
form[
11+
form(
12+
mark_safe(
13+
cookies[
14+
files[
15+
SQLAlchemy
16+
17+
sinks:
18+
replace( -> escape
19+
send_file( -> '..', '..' in
20+
execute(
21+
system(
22+
filter(
23+
subprocess.call(
24+
render_template(
25+
set_cookie(
26+
redirect(
27+
url_for(
28+
flash(
29+
jsonify(
30+
render(
31+
render_to_response(
32+
Popen(

pyt/vulnerabilities.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def identify_triggers(cfg, sources, sinks, lattice):
6868
"""
6969
assignment_nodes = filter_cfg_nodes(cfg, AssignmentNode)
7070
tainted_nodes = filter_cfg_nodes(cfg, TaintedNode)
71-
tainted_trigger_nodes = [TriggerNode('Flask function URL parameter', None,
71+
tainted_trigger_nodes = [TriggerNode('Framework function URL parameter', None,
7272
node) for node in tainted_nodes]
7373
sources_in_file = find_triggers(assignment_nodes, sources)
7474
sources_in_file.extend(tainted_trigger_nodes)

tests/vulnerabilities_test.py

+38-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from pyt.constraint_table import constraint_table, initialize_constraint_table
77
from pyt.fixed_point import analyse
88
from pyt.framework_adaptor import FrameworkAdaptor
9-
from pyt.framework_helper import is_flask_route_function
9+
from pyt.framework_helper import is_flask_route_function, is_django_view_function
1010
from pyt.lattice import Lattice
1111
from pyt.reaching_definitions_taint import ReachingDefinitionsTaintAnalysis
1212

@@ -318,7 +318,7 @@ def test_XSS_url_result(self):
318318
vulnerability_description = str(vulnerability_log.vulnerabilities[0])
319319
EXPECTED_VULNERABILITY_DESCRIPTION = """
320320
File: example/vulnerable_code/XSS_url.py
321-
> User input at line 4, trigger word "Flask function URL parameter":
321+
> User input at line 4, trigger word "Framework function URL parameter":
322322
url
323323
Reassigned in:
324324
File: example/vulnerable_code/XSS_url.py
@@ -454,3 +454,39 @@ def test_XSS_variable_multiple_assign_result(self):
454454
"""
455455

456456
self.assertTrue(self.string_compare_alpha(vulnerability_description, EXPECTED_VULNERABILITY_DESCRIPTION))
457+
458+
459+
class EngineDjangoTest(BaseTestCase):
460+
def run_empty(self):
461+
return
462+
463+
def run_analysis(self, path):
464+
self.cfg_create_from_file(path)
465+
cfg_list = [self.cfg]
466+
467+
FrameworkAdaptor(cfg_list, [], [], is_django_view_function)
468+
initialize_constraint_table(cfg_list)
469+
470+
analyse(cfg_list, analysis_type=ReachingDefinitionsTaintAnalysis)
471+
472+
trigger_word_file = os.path.join('pyt', 'trigger_definitions', 'django_trigger_words.pyt')
473+
474+
return vulnerabilities.find_vulnerabilities(cfg_list, ReachingDefinitionsTaintAnalysis, trigger_word_file=trigger_word_file)
475+
476+
def test_django_view_param(self):
477+
vulnerability_log = self.run_analysis('example/vulnerable_code/django_XSS.py')
478+
self.assert_length(vulnerability_log.vulnerabilities, expected_length=2)
479+
vulnerability_description = str(vulnerability_log.vulnerabilities[0])
480+
481+
EXPECTED_VULNERABILITY_DESCRIPTION = """
482+
File: example/vulnerable_code/django_XSS.py
483+
> User input at line 4, trigger word "Framework function URL parameter":
484+
param
485+
Reassigned in:
486+
File: example/vulnerable_code/django_XSS.py
487+
> Line 5: ret_xss1 = ¤call_1
488+
File: example/vulnerable_code/django_XSS.py
489+
> reaches line 5, trigger word "render(":
490+
¤call_1 = ret_render(request, 'templates/xss.html', 'param'param)
491+
"""
492+
self.assertTrue(self.string_compare_alpha(vulnerability_description, EXPECTED_VULNERABILITY_DESCRIPTION))

0 commit comments

Comments
 (0)