Movatterモバイル変換


[0]ホーム

URL:


CodeQL documentation
CodeQL resources

Log Injection

ID: py/log-injectionKind: path-problemSecurity severity: 7.8Severity: errorPrecision: mediumTags:   - security   - external/cwe/cwe-117Query suites:   - python-security-extended.qls   - python-security-and-quality.qls

Click to see the query in the CodeQL repository

If unsanitized user input is written to a log entry, a malicious user may be able to forge new log entries.

Forgery can occur if a user provides some input with characters that are interpreted when the log output is displayed. If the log is displayed as a plain text file, then new line characters can be used by a malicious user to create the appearance of multiple log entries. If the log is displayed as HTML, then arbitrary HTML may be included to spoof log entries.

Recommendation

User input should be suitably sanitized before it is logged.

If the log entries are plain text then line breaks should be removed from user input, using for examplereplace(old,new) or similar. Care should also be taken that user input is clearly marked in log entries, and that a malicious user cannot cause confusion in other ways.

For log entries that will be displayed in HTML, user input should be HTML encoded before being logged, to prevent forgery and other forms of HTML injection.

Example

In the example, the name provided by the user is recorded using the log output function (logging.info orapp.logger.info, etc.). In these four cases, the name provided by the user is not provided The processing is recorded. If a malicious user providesGuest%0D%0AUsername:Admin as a parameter, the log entry will be divided into two lines, the first line isUsername:Guest code>, the second line isUsername:Admin.

#!/usr/bin/env python# -*- coding: UTF-8 -*-"""@Desc   :Log Injection"""fromflaskimportFlaskfromflaskimportrequestfromdjango.utils.logimportrequest_loggerimportlogginglogging.basicConfig(level=logging.DEBUG)app=Flask(__name__)@app.route('/bad1')defbad1():name=request.args.get('name')app.logger.info('User name: '+name)# Badreturn'bad1'@app.route('/bad2')defbad2():name=request.args.get('name')logging.info('User name: '+name)# Badreturn'bad2'@app.route('/bad3')defbad3():name=request.args.get('name')request_logger.warn('User name: '+name)# Badreturn'bad3'@app.route('/bad4')defbad4():name=request.args.get('name')logtest=logging.getLogger('test')logtest.debug('User name: '+name)# Badreturn'bad4'if__name__=='__main__':app.debug=Truehandler=logging.FileHandler('log')app.logger.addHandler(handler)app.run()

In a good example, the program uses thereplace function to provide parameter processing to the user, and replace\r\n and\n with empty characters. To a certain extent, the occurrence of log injection vulnerabilities is reduced.

#!/usr/bin/env python# -*- coding: UTF-8 -*-"""@Desc   :Log Injection"""fromflaskimportFlaskfromflaskimportrequestimportlogginglogging.basicConfig(level=logging.DEBUG)app=Flask(__name__)@app.route('/good1')defgood1():name=request.args.get('name')name=name.replace('\r\n','').replace('\n','')logging.info('User name: '+name)# Goodreturn'good1'if__name__=='__main__':app.debug=Truehandler=logging.FileHandler('log')app.logger.addHandler(handler)app.run()

References


[8]ページ先頭

©2009-2025 Movatter.jp