Skip to content

Commit c41d72e

Browse files
authored
chore: add checker to detect globals context in django render (#121)
Signed-off-by: Maharshi Basu <basumaharshi10@gmail.com>
1 parent b8fde51 commit c41d72e

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import base64
2+
import mimetypes
3+
import os
4+
5+
from django.core.urlresolvers import reverse
6+
from django.http import HttpResponse
7+
from django.shortcuts import redirect, render
8+
from django.views.decorators.csrf import csrf_exempt
9+
from django.template import Template
10+
11+
# adapted from https://github.com/mpirnat/lets-be-bad-guys/blob/7cbf11014bfc6dc9e199dc0b8a64e4597bc2338f/badguys/vulnerable/views.py#L95
12+
13+
def file_access(request):
14+
msg = request.GET.get('msg', '')
15+
# <no-error>
16+
return render(request, 'vulnerable/injection/file_access.html',
17+
{'msg': msg})
18+
19+
20+
def bad1(request):
21+
# <expect-error>
22+
response = render(request, 'vulnerable/xss/form.html', globals())
23+
response.set_cookie(key='monster', value='omnomnomnomnom!')
24+
return response
25+
26+
def bad3(request):
27+
# <expect-error>
28+
response = Template.render(request, 'vulnerable/xss/form.html', globals())
29+
response.set_cookie(key='monster', value='omnomnomnomnom!')
30+
return response
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
language: py
2+
name: globals-as-template-context
3+
message: Detected the usage of `globals()` as context to `render()`
4+
category: security
5+
severity: error
6+
7+
pattern: |
8+
(call
9+
function: (identifier) @render
10+
arguments: (argument_list
11+
(_)*
12+
(call
13+
function: (identifier) @globals
14+
arguments: (argument_list))
15+
(_)*)
16+
(#eq? @render "render")
17+
(#eq? @globals "globals")) @globals-as-template-context
18+
19+
(call
20+
function: (attribute
21+
object: (identifier) @template
22+
attribute: (identifier) @render)
23+
arguments: (argument_list
24+
(_)*
25+
(call
26+
function: (identifier) @globals
27+
arguments: (argument_list))
28+
(_)*)
29+
(#eq? @template "Template")
30+
(#eq? @render "render")
31+
(#eq? @globals "globals")) @globals-as-template-context
32+
33+
description: |
34+
Using globals() in render(...) is dangerous—it exposes unintended Python functions, leading to server-side template injection (SSTI). Attackers could execute arbitrary code. Instead, pass only the required variables in a dictionary or `django.template.Context`.

0 commit comments

Comments
 (0)