diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00288.py b/PR_6_python/python/filtered_java/BenchmarkTest00288.py new file mode 100644 index 0000000..4297c4e --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00288.py @@ -0,0 +1,11 @@ +#{fact rule=os-command-injection@v1.0 defects=0} + +import os +import shlex +from somewhere import something + + +# ok:dangerous-spawn-process +os.spawnv(os.P_WAIT, "/bin/ls") + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00298.py b/PR_6_python/python/filtered_java/BenchmarkTest00298.py new file mode 100644 index 0000000..c26c17e --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00298.py @@ -0,0 +1,21 @@ +#{fact rule=code-injection@v1.0 defects=1} + +import flask + +app = flask.Flask(__name__) + + +@app.route("/error2") +def error2(e): + # ruleid: dangerous-template-string + template = '''{ extends "layout.html" } +{ block body } +
+

Oops! That page doesn't exist.

+

%s

+
+{ endblock } +''' % (request.url) + return flask.render_template_string(template), 404 + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00389.py b/PR_6_python/python/filtered_java/BenchmarkTest00389.py new file mode 100644 index 0000000..3ea31ad --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00389.py @@ -0,0 +1,12 @@ +#{fact rule=insecure-file-permissions@v1.0 defects=1} + +import os +import stat + +def ensure_exec_perms2(file_): + st = os.stat(file_) + # ruleid:insecure-file-permissions + os.chmod(file_, st.st_mode | 0o111) + return file_ + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00399.py b/PR_6_python/python/filtered_java/BenchmarkTest00399.py new file mode 100644 index 0000000..3b166ba --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00399.py @@ -0,0 +1,11 @@ +#{fact rule=insecure-cryptography@v1.0 defects=1} + +# cf. https://github.com/PyCQA/bandit/blob/b1411bfb43795d3ffd268bef17a839dee954c2b1/examples/hashlib_new_insecure_functions.py + +import hashlib + +# ruleid:insecure-hash-function +hashlib.new(name='md5', string='test') + + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00400.py b/PR_6_python/python/filtered_java/BenchmarkTest00400.py new file mode 100644 index 0000000..b9d929b --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00400.py @@ -0,0 +1,11 @@ +#{fact rule=insecure-connection@v1.0 defects=1} + +from urllib.request import OpenerDirector + +def test1(): + od = OpenerDirector() + # ruleid: insecure-openerdirector-open-ftp + od.open("ftp://example.com") + + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00410.py b/PR_6_python/python/filtered_java/BenchmarkTest00410.py new file mode 100644 index 0000000..66992ce --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00410.py @@ -0,0 +1,9 @@ +#{fact rule=insecure-connection@v1.0 defects=1} + +from urllib.request import Request + +def test1(): + # ruleid: insecure-request-object + Request("http://example.com") + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00434.py b/PR_6_python/python/filtered_java/BenchmarkTest00434.py new file mode 100644 index 0000000..8062ddb --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00434.py @@ -0,0 +1,16 @@ +#{fact rule=sql-injection@v1.0 defects=0} + +import asyncio +import asyncpg + + +def ok8(user_input): + conn = await aiopg.connect(database='aiopg', + user='aiopg', + password='secret', + host='127.0.0.1') + cur = await conn.cursor() + # ok: aiopg-sqli + cur.execute('SELECT * FROM John'.format()) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00441.py b/PR_6_python/python/filtered_java/BenchmarkTest00441.py new file mode 100644 index 0000000..dcf73c3 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00441.py @@ -0,0 +1,12 @@ +#{fact rule=cross-site-scripting@v1.0 defects=0} + +import asyncio +import asyncpg + + +def ok8(user_input): + con = await asyncpg.connect(user='postgres') + # ok: asyncpg-sqli + con.execute('SELECT * FROM John'.format()) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00451.py b/PR_6_python/python/filtered_java/BenchmarkTest00451.py new file mode 100644 index 0000000..f78c135 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00451.py @@ -0,0 +1,12 @@ +#{fact rule=untrusted-deserialization@v1.0 defects=1} + +from django.http import HttpResponse +import datetime + + + +def current_datetime(request): + # ruleid:avoid-insecure-deserialization + return "Hey there! {}!".format(pickle.loads(b64decode(request.cookies.get('uuid')))) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00475.py b/PR_6_python/python/filtered_java/BenchmarkTest00475.py new file mode 100644 index 0000000..8010300 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00475.py @@ -0,0 +1,10 @@ +#{fact rule=code-injection@v1.0 defects=0} + +import code + + +def ok4() -> None: + inperpreter = code.InteractiveInterpreter() + inperpreter.runsource('print(123)') + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00501.py b/PR_6_python/python/filtered_java/BenchmarkTest00501.py new file mode 100644 index 0000000..be2efe2 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00501.py @@ -0,0 +1,31 @@ +#{fact rule=cross-site-scripting@v1.0 defects=0} + +# -*- coding: utf-8 -*- +import os +import sqlite3 + +from flask import Flask +from flask import redirect +from flask import request +from flask import session +from jinja2 import Template + +app = Flask(__name__) + + +@app.route("/loginpage4") +def render_login_page4(): + thing = "blah" + # the string below is now detected as a literal string after constant + # propagation + # ok:directly-returned-format-string + return thing + ''' +
+

+

+

+
+ ''' + + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00525.py b/PR_6_python/python/filtered_java/BenchmarkTest00525.py new file mode 100644 index 0000000..972b1f2 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00525.py @@ -0,0 +1,18 @@ +#{fact rule=sql-injection@v1.0 defects=1} + +from django.db.models import ( + CharField, Expression, Field, FloatField, Lookup, TextField, Value, +) +from django.db.models.expressions import CombinedExpression, Func, Subquery +from django.db.models.functions import Cast, Coalesce + + + + + +# ruleid: extends-custom-expression +class SQCount(Subquery): + template = "(SELECT count(*) FROM (%(subquery)s) _count)" + output_field = IntegerField() + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00535.py b/PR_6_python/python/filtered_java/BenchmarkTest00535.py new file mode 100644 index 0000000..1441d11 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00535.py @@ -0,0 +1,37 @@ +#{fact rule=os-command-injection@v1.0 defects=0} + +import requests +from datetime import timedelta +from airflow import DAG +from airflow.operators.bash_operator import BashOperator +from airflow.utils.dates import days_ago + +default_args = { + "owner": "airflow", + "depends_on_past": False, + "start_date": days_ago(2), + "email": ["airflow@example.com"], + "email_on_failure": False, + "email_on_retry": False, + "retries": 1, + "retry_delay": timedelta(minutes=5) +} + +dag = DAG( + "tutorialex2", + default_args=default_args, + description="Tutorial DAG", + schedule_interval=timedelta(days=1) +) + +message = requests.get("https://fakeurl.asdf/message").text + + +# ok: formatted-string-bashoperator +t5 = BashOperator( + task_id="safe", + bash_command="echo hello world!", + dag=dag +) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00540.py b/PR_6_python/python/filtered_java/BenchmarkTest00540.py new file mode 100644 index 0000000..f32eee7 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00540.py @@ -0,0 +1,11 @@ +#{fact rule=detect-activated-debug-feature@v1.0 defects=1} + +import os +import flask +app = flask.Flask(__name__) + + +# ruleid: avoid_hardcoded_config_ENV +app.config["ENV"] = "development" + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00564.py b/PR_6_python/python/filtered_java/BenchmarkTest00564.py new file mode 100644 index 0000000..ea84bfc --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00564.py @@ -0,0 +1,10 @@ +#{fact rule=insecure-connection@v1.0 defects=1} + +from urllib.request import OpenerDirector + + +def test3(): + # ruleid: insecure-openerdirector-open-ftp + OpenerDirector().open("ftp://example.com") + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00647.py b/PR_6_python/python/filtered_java/BenchmarkTest00647.py new file mode 100644 index 0000000..c64581d --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00647.py @@ -0,0 +1,27 @@ +#{fact rule=cross-site-scripting@v1.0 defects=1} + +from django.shortcuts import render +from django.shortcuts import render_to_response +from django.utils.html import escape + +class FalsePositiveCheck499View(VulnerableTemplateView): + title = '(almost) Cross-Site Scripting' + tags = ['false-positive', 'GET', 'filtered'] + description = 'Echo query string parameter to HTML tag attribute removing'\ + ' the single quotes which are present in the input.' + url_path = '499_check.py?text=1' + false_positive_check = True + references = ['https://github.com/andresriancho/w3af/pull/499'] + + def getB(self, request, *args, **kwds): + context = self.get_context_data() + + text = request.GET['text'] + text = text.replace('"', '') + + # ruleid: raw-html-format + context['html'] = 'Check link href' + + return render(request, self.template_name, context) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00657.py b/PR_6_python/python/filtered_java/BenchmarkTest00657.py new file mode 100644 index 0000000..ceafeac --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00657.py @@ -0,0 +1,13 @@ +#{fact rule=cross-site-scripting@v1.0 defects=1} + +import urllib +from django.db.models import Q +from django.auth import User +from django.http import HttpResponse, HttpResponseBadRequest +from django.utils.translation import ugettext as _ + +def inline_test(request): + # ruleid: reflected-data-httpresponsebadrequest + return HttpResponseBadRequest("Received {}".format(request.POST.get('message'))) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00690.py b/PR_6_python/python/filtered_java/BenchmarkTest00690.py new file mode 100644 index 0000000..b6f9970 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00690.py @@ -0,0 +1,19 @@ +# #{ex-fact rule=sql-injection@v1.0 defects=1} +# +# from django.http import HttpResponse +# +# class Person(models.Model): +# first_name = models.CharField(...) +# last_name = models.CharField(...) +# birth_date = models.DateField(...) +# +# ##### raw() True Positives ######### +# def get_user_age(request): +# # ruleid: sql-injection-using-raw +# user_name = request.get('user_name') +# user_age = Person.objects.raw('SELECT user_age FROM myapp_person where user_name = %s' % user_name) +# html = "User Age %s." % user_age +# return HttpResponse(html) +# +# +# #{/ex-fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00703.py b/PR_6_python/python/filtered_java/BenchmarkTest00703.py new file mode 100644 index 0000000..90beb62 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00703.py @@ -0,0 +1,15 @@ +#{fact rule=os-command-injection@v1.0 defects=1} + +import os +import flask +import hashlib + +app = flask.Flask(__name__) + +@app.route("/get_param_concat", methods=["GET"]) +def get_param_concat(): + param = flask.request.args.get("param") + # ruleid: os-system-injection + os.system("echo " + param) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00707.py b/PR_6_python/python/filtered_java/BenchmarkTest00707.py new file mode 100644 index 0000000..67f43d0 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00707.py @@ -0,0 +1,24 @@ +#{fact rule=os-command-injection@v1.0 defects=1} + +import os +import flask +import hashlib + +app = flask.Flask(__name__) + +# Real world example +@app.route('/', methods=['GET', 'POST']) +def index(): + if flask.request.method == 'GET': + return flask.render_template('index.html') + # check url first + url = flask.request.form.get('url', None) + if url != '': + md5 = hashlib.md5(url+app.config['MD5_SALT']).hexdigest() + fpath = join(join(app.config['MEDIA_ROOT'], 'upload'), md5+'.jpg') + # ruleid: os-system-injection + r = os.system('wget %s -O "%s"'%(url, fpath)) + if r != 0: abort(403) + return flask.redirect(flask.url_for('landmark', hash=md5)) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00717.py b/PR_6_python/python/filtered_java/BenchmarkTest00717.py new file mode 100644 index 0000000..c582011 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00717.py @@ -0,0 +1,15 @@ +# #{ex-fact rule=sql-injection@v1.0 defects=1} + +# import pg8000.native as pg +# import pg8000.dbapi +# +# +# import pg8000.native as pg +# import pg8000.dbapi + +# def bad5(): +# conn = pg8000.connect(user='postgres', password='password', database='andromedabot') +# # ruleid: pg8000-sqli +# conn.executemany("SELECT name FROM users WHERE age=" + req.FormValue("age")) + +# #{/ex-fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00723.py b/PR_6_python/python/filtered_java/BenchmarkTest00723.py new file mode 100644 index 0000000..d9a1754 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00723.py @@ -0,0 +1,14 @@ +#{fact rule=sql-injection@v1.0 defects=0} + +import pg8000.native as pg +import pg8000.dbapi + + +def ok3(user_input): + conn = pg8000.connect(user='postgres', password='password', database='andromedabot') + query = "SELECT name FROM users WHERE age=" + query += "3" + # ok: pg8000-sqli + conn.execute(query) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00746.py b/PR_6_python/python/filtered_java/BenchmarkTest00746.py new file mode 100644 index 0000000..4b4b303 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00746.py @@ -0,0 +1,14 @@ +#{fact rule=cross-site-scripting@v1.0 defects=1} + +import os +import flask +import hashlib + +app = flask.Flask(__name__) + +@app.route("/get_param_inline", methods=["GET"]) +def get_param_inline(): + # ruleid:raw-html-format + return "Click me!" % flask.request.args.get("param") + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00781.py b/PR_6_python/python/filtered_java/BenchmarkTest00781.py new file mode 100644 index 0000000..852a681 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00781.py @@ -0,0 +1,17 @@ +#{fact rule=sql-injection@v1.0 defects=1} + +from django.http import HttpResponse + +class Person(models.Model): + first_name = models.CharField(...) + last_name = models.CharField(...) + birth_date = models.DateField(...) + +def get_users(request): + # ruleid: sql-injection-using-raw + client_id = request.headers.get('client_id') + users = Person.objects.raw('SELECT * FROM myapp_person where client_id = %s' % client_id) + html = "Users %s." % users + return HttpResponse(html) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00791.py b/PR_6_python/python/filtered_java/BenchmarkTest00791.py new file mode 100644 index 0000000..2d6896c --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00791.py @@ -0,0 +1,10 @@ +#{fact rule=insecure-connection@v1.0 defects=1} + +from urllib.request import URLopener + +def test1(): + od = URLopener() + # ruleid: insecure-urlopener-retrieve + od.retrieve("http://example.com") + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00804.py b/PR_6_python/python/filtered_java/BenchmarkTest00804.py new file mode 100644 index 0000000..959cb55 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00804.py @@ -0,0 +1,11 @@ +#{fact rule=insecure-cryptography@v1.0 defects=1} + +import os +from cryptography.hazmat import backends +from cryptography.hazmat.primitives.asymmetric import ec + +# ruleid: insufficient-ec-key-size +ec.generate_private_key(curve=ec.SECP192R1, + backend=backends.default_backend()) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00814.py b/PR_6_python/python/filtered_java/BenchmarkTest00814.py new file mode 100644 index 0000000..3cb3dc3 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00814.py @@ -0,0 +1,14 @@ +#{fact rule=weak-obfuscation-of-request@v1.0 defects=1} + +import jwt + +# ruleid: jwt-python-hardcoded-secret +secret_const = "this-is-secret" + +def bad1(): + # ruleid: jwt-python-hardcoded-secret + encoded = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256') + return encoded + + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00820.py b/PR_6_python/python/filtered_java/BenchmarkTest00820.py new file mode 100644 index 0000000..33584d6 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00820.py @@ -0,0 +1,12 @@ +#{fact rule=code-injection@v1.0 defects=1} + +from logging.config import listen + +PORT_NUMBER = 1234 + +def start_log(): + # ruleid: listen-eval + t = listen(PORT_NUMBER) + t.start() + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00830.py b/PR_6_python/python/filtered_java/BenchmarkTest00830.py new file mode 100644 index 0000000..e6d569c --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00830.py @@ -0,0 +1,9 @@ +#{fact rule=insecure-connection@v1.0 defects=1} + +from urllib.request import URLopener + +def test3(): + # ruleid: insecure-urlopener-open + URLopener().open("http://example.com") + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00845.py b/PR_6_python/python/filtered_java/BenchmarkTest00845.py new file mode 100644 index 0000000..f0e9e67 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00845.py @@ -0,0 +1,10 @@ +#{fact rule=insecure-connection@v1.0 defects=1} + +from urllib.request import URLopener + +def test6(url = "ftp://example.com"): + od = URLopener() + # ruleid: insecure-urlopener-retrieve-ftp + od.retrieve(url) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00892.py b/PR_6_python/python/filtered_java/BenchmarkTest00892.py new file mode 100644 index 0000000..c59612c --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00892.py @@ -0,0 +1,66 @@ +#{fact rule=sql-injection@v1.0 defects=0} + +import json +import os +import typing as t + +import boto3 +import sqlalchemy +from aws_lambda_powertools import Logger, Tracer +from aws_lambda_powertools.utilities.typing import LambdaContext + +SERVICE = "lambda-connection-pooling-demo" +logger = Logger(service=SERVICE) +tracer = Tracer(service=SERVICE) + +class LambdaProxyIntegrationResponse(t.TypedDict, total=False): + statusCode: int + body: str + headers: t.Dict[str, t.Any] + +DB_USER_SECRET_NAME = os.environ.get("DB_USER_SECRET_NAME") +DB_HOST = os.environ.get("DB_HOST") + +secrentsmanager = boto3.client(service_name='secretsmanager') +get_secret_value_response = secrentsmanager.get_secret_value(SecretId=DB_USER_SECRET_NAME) +secret = json.loads(get_secret_value_response["SecretString"]) +db_user = secret["username"] +db_password = secret["password"] +db_host = DB_HOST or secret["host"] +db_port = secret["port"] + +url = f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/" +engine = sqlalchemy.create_engine( + url, + connect_args={ + "ssl": { + "ssl_ca": "./AmazonRootCA1.pem", + } + }, + pool_recycle=50, +) + +def handler(event, context): + logger.debug("connecting to db...") + with engine.connect() as connection: + try: + # ok: sqlalchemy-sqli + connection.execute("SELECT * FROM foobar WHERE id = '?'", event['id']) + except Exception as e: + logger.error("An error occured:") + print(e) + return { + "statusCode": 200, + "body": json.dumps({ + "state": "ERROR", + "message": f"response from '{context.log_stream_name}'" + }) + } + return { + "statusCode": 200, + "body": json.dumps({ + "state": "SUCCESS", + "message": f"response from '{context.log_stream_name}'" + }) + } +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00905.py b/PR_6_python/python/filtered_java/BenchmarkTest00905.py new file mode 100644 index 0000000..d4a7b52 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00905.py @@ -0,0 +1,15 @@ +#{fact rule=server-side-request-forgery@v1.0 defects=1} + +import flask +import requests + +app = flask.Flask(__name__) + + +@app.route("/get_param", methods=["GET"]) +def get_param(): + param = flask.request.args.get("param") + # ruleid: ssrf-requests + requests.post(param, timeout=10) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00911.py b/PR_6_python/python/filtered_java/BenchmarkTest00911.py new file mode 100644 index 0000000..406729a --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00911.py @@ -0,0 +1,10 @@ +#{fact rule=os-command-injection@v1.0 defects=0} + +import subprocess +import sys + +# ok:subprocess-shell-true +subprocess.call("echo 'hello'", shell=True) + + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00915.py b/PR_6_python/python/filtered_java/BenchmarkTest00915.py new file mode 100644 index 0000000..306bf6d --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00915.py @@ -0,0 +1,8 @@ +#{fact rule=code-injection@v1.0 defects=0} + +def handler(event, context): + # ok:tainted-code-exec + exec("x = 1; x = x + 2") + + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00921.py b/PR_6_python/python/filtered_java/BenchmarkTest00921.py new file mode 100644 index 0000000..3e25037 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00921.py @@ -0,0 +1,11 @@ +#{fact rule=cross-site-scripting@v1.0 defects=1} + +def lambda_handler(event, context): + + response = {} + + link1 = 'Check link href' + # ruleid: tainted-html-string + response['html1'] = link1 % event['input'] + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00931.py b/PR_6_python/python/filtered_java/BenchmarkTest00931.py new file mode 100644 index 0000000..24c48ba --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00931.py @@ -0,0 +1,26 @@ +#{fact rule=insecure-connection@v1.0 defects=1} + +# cf. https://github.com/PyCQA/bandit/blob/d5f8fa0d89d7b11442fc6ec80ca42953974354c8/examples/telnetlib.py + +import telnetlib +import getpass + +host = sys.argv[1] + +username = raw_input('Username:') +password = getpass.getpass() +# ruleid:telnetlib +tn = telnetlib.Telnet(host) + +tn.read_until("login: ") +tn.write(username + "\n") +if password: + tn.read_until("Password: ") + tn.write(password + "\n") + +tn.write("ls\n") +tn.write("exit\n") + +print(tn.read_all()) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00940.py b/PR_6_python/python/filtered_java/BenchmarkTest00940.py new file mode 100644 index 0000000..78baea7 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00940.py @@ -0,0 +1,10 @@ +#{fact rule=cross-site-scripting@v1.0 defects=1} + +from flask import make_response, request + +def test3(): + # ruleid: response-contains-unsanitized-input + x = request.args.get("x") + return make_response(f"found {x}") + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00944.py b/PR_6_python/python/filtered_java/BenchmarkTest00944.py new file mode 100644 index 0000000..0e2b15f --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00944.py @@ -0,0 +1,14 @@ +#{fact rule=incorrect-authentication-exploitation@v1.0 defects=1} + +# cf. https://github.com/we45/Vulnerable-Flask-App/blob/752ee16087c0bfb79073f68802d907569a1f0df7/app/app.py#L96 + +import jwt +from jwt.exceptions import DecodeError, MissingRequiredClaimError, InvalidKeyError + +def insecure_verify(token): + # ruleid:unverified-jwt-decode + decoded = jwt.decode(token, verify = False) + print(decoded) + return True + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00954.py b/PR_6_python/python/filtered_java/BenchmarkTest00954.py new file mode 100644 index 0000000..f66db56 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00954.py @@ -0,0 +1,43 @@ +#{fact rule=ldap-authentication@v1.0 defects=1} + +from django.contrib import auth +from django.contrib.auth.password_validation import validate_password +from django.core.exceptions import PermissionDenied, ValidationError +from django.utils.translation import gettext as _ +from django.views.decorators.csrf import csrf_protect +from rest_framework import status +from rest_framework.decorators import api_view, permission_classes +from rest_framework.response import Response + +from ...conf import settings +from ...core.decorators import require_dict_data +from ...core.mail import mail_user +from ..bans import get_user_ban +from ..forms.auth import AuthenticationForm, ResendActivationForm, ResetPasswordForm +from ..serializers import AnonymousUserSerializer, AuthenticatedUserSerializer +from ..tokens import ( + is_password_change_token_valid, + make_activation_token, + make_password_change_token, +) +from .rest_permissions import UnbannedAnonOnly, UnbannedOnly + +User = auth.get_user_model() +BaseUserManager = User.__class__ + + +class UserManager(BaseUserManager): + # ruleid: use-none-for-password-default + def create_user(self, email, password=""): + """ + Creates and saves a Poster with the given email and password. + """ + if not email: + raise ValueError('Users must have an email address') + + user = self.model(email=self.normalize_email(email)) + user.set_password(password) + user.save(using=self._db) + return user + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00960.py b/PR_6_python/python/filtered_java/BenchmarkTest00960.py new file mode 100644 index 0000000..af2f9e6 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00960.py @@ -0,0 +1,12 @@ +#{fact rule=code-injection@v1.0 defects=0} + +from textwrap import dedent + +def safe(request): + # ok: user-eval + code = """ + print('hello') + """ + eval(dedent(code)) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00970.py b/PR_6_python/python/filtered_java/BenchmarkTest00970.py new file mode 100644 index 0000000..88b4255 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00970.py @@ -0,0 +1,13 @@ +#{fact rule=no-auth-over-http@v1.0 defects=1} + +import requests + +def from_import_test1(url): + from requests import get, post + # ruleid:no-auth-over-http + good_url = "https://www.github.com" + bad_url = "http://www.github.com" + r = get(good_url, timeout=3) + r = post(bad_url) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest00983.py b/PR_6_python/python/filtered_java/BenchmarkTest00983.py new file mode 100644 index 0000000..655b6e8 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest00983.py @@ -0,0 +1,10 @@ +#{fact rule=code-injection@v1.0 defects=1} + +from textwrap import dedent + +def fmt_unsafe_inline(request): + # ruleid: user-exec-format-string + exec("print({})".format(request.GET.get('message'))) + + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest01006.py b/PR_6_python/python/filtered_java/BenchmarkTest01006.py new file mode 100644 index 0000000..fccf2e8 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest01006.py @@ -0,0 +1,14 @@ +#{fact rule=server-side-request-forgery@v1.0 defects=1} + + +def test_bad_5(): + from requests import get + from django.shortcuts import render + + def send_to_redis(request): + # ruleid: ssrf-injection-requests + bucket = request.GET["bucket"] + inner_response = get("http://my.redis.foo/{}".format(bucket), data=3) + return render({"response_code": inner_response.status_code}) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest01012.py b/PR_6_python/python/filtered_java/BenchmarkTest01012.py new file mode 100644 index 0000000..be14276 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest01012.py @@ -0,0 +1,15 @@ +#{fact rule=server-side-request-forgery@v1.0 defects=1} + +import flask +import requests + +app = flask.Flask(__name__) + + +@app.route("/get_param_percent_format", methods=["GET"]) +def get_param_percent_format(): + param = flask.request.args.get("param") + # ruleid: ssrf-requests + requests.get("%s/id" % (param,)) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest01016.py b/PR_6_python/python/filtered_java/BenchmarkTest01016.py new file mode 100644 index 0000000..4e8ff5e --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest01016.py @@ -0,0 +1,12 @@ +#{fact rule=os-command-injection@v1.0 defects=1} + +import sh + +long = os.environ.get("LONG", "") + + +# ruleid: string-concat +sh.semgrep(f"--config {confurl}") + + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest01022.py b/PR_6_python/python/filtered_java/BenchmarkTest01022.py new file mode 100644 index 0000000..cd49015 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest01022.py @@ -0,0 +1,9 @@ +#{fact rule=code-injection@v1.0 defects=0} + +def handler(event, context): + + blah2 = "import requests; r = requests.get('https://example.com')" + # ok:tainted-code-exec + eval(blah2) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest01026.py b/PR_6_python/python/filtered_java/BenchmarkTest01026.py new file mode 100644 index 0000000..31a313c --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest01026.py @@ -0,0 +1,18 @@ +#{fact rule=sql-injection@v1.0 defects=1} + +from django.http import HttpResponse + + +class Person(models.Model): + first_name = models.CharField(...) + last_name = models.CharField(...) + birth_date = models.DateField(...) + +def get_user_age6(request): + query = "SELECT user_age FROM myapp_person where user_name = {}" + # ruleid: tainted-sql-string + user_age = Person.objects.raw(query.format(request.GET.get("user_name"))) + html = "User Age %s." % user_age + return HttpResponse(html) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest01032.py b/PR_6_python/python/filtered_java/BenchmarkTest01032.py new file mode 100644 index 0000000..c6c8547 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest01032.py @@ -0,0 +1,20 @@ +#{fact rule=server-side-request-forgery@v1.0 defects=1} + +from django.http import HttpResponse +import requests + +class Person(models.Model): + first_name = models.CharField(...) + last_name = models.CharField(...) + birth_date = models.DateField(...) + + +def ex5(request): + env = request.POST.get('env') + user_name = request.POST.get('user_name') + # ruleid: tainted-url-host + url = "https://{}/{}/age".format(env, user_name) + user_age = requests.get(url) + return HttpResponse(user_age) + +#{/fact} diff --git a/PR_6_python/python/filtered_java/BenchmarkTest01043.py b/PR_6_python/python/filtered_java/BenchmarkTest01043.py new file mode 100644 index 0000000..607e6d6 --- /dev/null +++ b/PR_6_python/python/filtered_java/BenchmarkTest01043.py @@ -0,0 +1,12 @@ +#{fact rule=cross-site-scripting@v1.0 defects=0} + +from flask import Flask, render_template +app = Flask(__name__) + + +@app.route("no_vars") +def no_vars(): + # ok: unescaped-template-extension + return render_template("unsafe.txt") + +#{/fact} diff --git a/PR_6_python/python/filtered_java/VULNERABILITY_SUMMARY.md b/PR_6_python/python/filtered_java/VULNERABILITY_SUMMARY.md new file mode 100644 index 0000000..6b53782 --- /dev/null +++ b/PR_6_python/python/filtered_java/VULNERABILITY_SUMMARY.md @@ -0,0 +1,34 @@ +# Filtered Vulnerability Files Summary + +## Overview +This folder contains 50 Python files filtered from the AWS Guru Python Security Benchmarks dataset, specifically selected for their relevance to the **Top 25 Most Dangerous Software Weaknesses (2023 CWE Top 25)**. + +## Filtering Criteria +Files were selected based on containing patterns related to these CWE vulnerabilities: + +### Top 25 CWE Vulnerabilities Covered: +- **CWE-78**: OS Command Injection (e.g., BenchmarkTest01016.py, BenchmarkTest00288.py) +- **CWE-79**: Cross-site Scripting (XSS) (e.g., BenchmarkTest00298.py) +- **CWE-89**: SQL Injection (e.g., BenchmarkTest00434.py) +- **CWE-94**: Code Injection (template string vulnerabilities) +- **CWE-276**: Incorrect Default Permissions (e.g., BenchmarkTest00389.py) +- **CWE-918**: Server-Side Request Forgery (insecure connections) +- And other related security vulnerabilities + +## File Structure +- Total files: 50 Python test cases +- Each file contains: + - `#{fact rule=...}` annotations indicating the vulnerability type + - `# ruleid:` comments marking vulnerable code patterns + - Both vulnerable and secure code examples + +## Usage +These files can be used for: +- Security testing and validation +- Training security analysis tools +- Educational purposes for understanding common vulnerabilities +- Benchmarking security scanners + +## Source +Filtered from: `/Prime/local_python_semgrep/semgrep_python/` and related directories +Original dataset: AWS Guru Python Security Benchmarks \ No newline at end of file diff --git a/PR_6_python/python/filtered_java/filter_vulnerabilities.py b/PR_6_python/python/filtered_java/filter_vulnerabilities.py new file mode 100644 index 0000000..1f94413 --- /dev/null +++ b/PR_6_python/python/filtered_java/filter_vulnerabilities.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +import os +import shutil +import re +from pathlib import Path + +# Top 25 CWE vulnerabilities mapping to common patterns +CWE_PATTERNS = { + 'CWE-787': ['buffer-overflow', 'out-of-bounds-write'], + 'CWE-79': ['xss', 'cross-site-scripting', 'template-string'], + 'CWE-89': ['sql-injection', 'sqli'], + 'CWE-416': ['use-after-free'], + 'CWE-78': ['os-command-injection', 'command-injection'], + 'CWE-20': ['input-validation', 'improper-input'], + 'CWE-125': ['out-of-bounds-read'], + 'CWE-22': ['path-traversal', 'directory-traversal'], + 'CWE-352': ['csrf', 'cross-site-request-forgery'], + 'CWE-434': ['file-upload', 'unrestricted-upload'], + 'CWE-862': ['missing-authorization', 'authorization'], + 'CWE-476': ['null-pointer'], + 'CWE-287': ['improper-authentication', 'authentication'], + 'CWE-190': ['integer-overflow'], + 'CWE-502': ['deserialization', 'pickle', 'yaml-load'], + 'CWE-77': ['command-injection'], + 'CWE-119': ['buffer-overflow'], + 'CWE-798': ['hardcoded-credentials', 'hard-coded'], + 'CWE-918': ['ssrf', 'server-side-request-forgery'], + 'CWE-306': ['missing-authentication'], + 'CWE-362': ['race-condition'], + 'CWE-269': ['privilege-management'], + 'CWE-94': ['code-injection'], + 'CWE-863': ['incorrect-authorization'], + 'CWE-276': ['file-permissions', 'insecure-file-permissions'] +} + +def is_vulnerability_related(file_path): + """Check if file contains vulnerability patterns""" + try: + with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: + content = f.read().lower() + + # Check for fact rule patterns + for cwe, patterns in CWE_PATTERNS.items(): + for pattern in patterns: + if pattern in content: + return True + + # Check for ruleid patterns + if 'ruleid:' in content: + return True + + return False + except Exception: + return False + +def main(): + prime_dir = Path('/Users/branedev/Documents/delete_claude_detections_gaurav/compare-for-llm/AWSGuruPythonSecurityBenchmarks/datasets/aws_guru_python_security_benchmarks/Prime') + output_dir = prime_dir / 'filtered_java' + + # Create output directory + output_dir.mkdir(exist_ok=True) + + # Find all Python files + py_files = list(prime_dir.rglob('*.py')) + print(f"Found {len(py_files)} Python files") + + # Filter vulnerability-related files + vuln_files = [] + for py_file in py_files: + if is_vulnerability_related(py_file): + vuln_files.append(py_file) + + print(f"Found {len(vuln_files)} vulnerability-related files") + + # Copy first 50 files to output directory + copied_count = 0 + for file_path in vuln_files[:50]: + try: + dest_path = output_dir / file_path.name + shutil.copy2(file_path, dest_path) + copied_count += 1 + print(f"Copied: {file_path.name}") + except Exception as e: + print(f"Error copying {file_path.name}: {e}") + + print(f"\nSuccessfully copied {copied_count} files to {output_dir}") + +if __name__ == "__main__": + main() \ No newline at end of file