mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
JavaScript: Autoformat
This commit is contained in:
@@ -317,7 +317,8 @@ abstract class OtherModeledArgumentCharacteristic extends EndpointCharacteristic
|
|||||||
* A characteristic that is an indicator of not being a sink of any type, because it's an argument to a function of a
|
* A characteristic that is an indicator of not being a sink of any type, because it's an argument to a function of a
|
||||||
* builtin object.
|
* builtin object.
|
||||||
*/
|
*/
|
||||||
abstract private class ArgumentToBuiltinFunctionCharacteristic extends OtherModeledArgumentCharacteristic {
|
abstract private class ArgumentToBuiltinFunctionCharacteristic extends OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
bindingset[this]
|
bindingset[this]
|
||||||
ArgumentToBuiltinFunctionCharacteristic() { any() }
|
ArgumentToBuiltinFunctionCharacteristic() { any() }
|
||||||
}
|
}
|
||||||
@@ -358,7 +359,8 @@ abstract class LikelyNotASinkCharacteristic extends EndpointCharacteristic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class LodashUnderscoreCharacteristic extends NotASinkCharacteristic,
|
private class LodashUnderscoreCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
LodashUnderscoreCharacteristic() { this = "LodashUnderscoreArgument" }
|
LodashUnderscoreCharacteristic() { this = "LodashUnderscoreArgument" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -367,7 +369,8 @@ private class LodashUnderscoreCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class JQueryArgumentCharacteristic extends NotASinkCharacteristic,
|
private class JQueryArgumentCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
JQueryArgumentCharacteristic() { this = "JQueryArgument" }
|
JQueryArgumentCharacteristic() { this = "JQueryArgument" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -376,7 +379,8 @@ private class JQueryArgumentCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ClientRequestCharacteristic extends NotASinkCharacteristic,
|
private class ClientRequestCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
ClientRequestCharacteristic() { this = "ClientRequest" }
|
ClientRequestCharacteristic() { this = "ClientRequest" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -387,7 +391,8 @@ private class ClientRequestCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class PromiseDefinitionCharacteristic extends NotASinkCharacteristic,
|
private class PromiseDefinitionCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
PromiseDefinitionCharacteristic() { this = "PromiseDefinition" }
|
PromiseDefinitionCharacteristic() { this = "PromiseDefinition" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -398,14 +403,16 @@ private class PromiseDefinitionCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class CryptographicKeyCharacteristic extends NotASinkCharacteristic,
|
private class CryptographicKeyCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
CryptographicKeyCharacteristic() { this = "CryptographicKey" }
|
CryptographicKeyCharacteristic() { this = "CryptographicKey" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) { n instanceof CryptographicKey }
|
override predicate appliesToEndpoint(DataFlow::Node n) { n instanceof CryptographicKey }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class CryptographicOperationFlowCharacteristic extends NotASinkCharacteristic,
|
private class CryptographicOperationFlowCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
CryptographicOperationFlowCharacteristic() { this = "CryptographicOperationFlow" }
|
CryptographicOperationFlowCharacteristic() { this = "CryptographicOperationFlow" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -414,7 +421,8 @@ private class CryptographicOperationFlowCharacteristic extends NotASinkCharacter
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class LoggerMethodCharacteristic extends NotASinkCharacteristic,
|
private class LoggerMethodCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
LoggerMethodCharacteristic() { this = "LoggerMethod" }
|
LoggerMethodCharacteristic() { this = "LoggerMethod" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -425,7 +433,8 @@ private class LoggerMethodCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class TimeoutCharacteristic extends NotASinkCharacteristic,
|
private class TimeoutCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
TimeoutCharacteristic() { this = "Timeout" }
|
TimeoutCharacteristic() { this = "Timeout" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -436,7 +445,8 @@ private class TimeoutCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ReceiverStorageCharacteristic extends NotASinkCharacteristic,
|
private class ReceiverStorageCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
ReceiverStorageCharacteristic() { this = "ReceiverStorage" }
|
ReceiverStorageCharacteristic() { this = "ReceiverStorage" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -447,7 +457,8 @@ private class ReceiverStorageCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class StringStartsWithCharacteristic extends NotASinkCharacteristic,
|
private class StringStartsWithCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
StringStartsWithCharacteristic() { this = "StringStartsWith" }
|
StringStartsWithCharacteristic() { this = "StringStartsWith" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -458,7 +469,8 @@ private class StringStartsWithCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class StringEndsWithCharacteristic extends NotASinkCharacteristic,
|
private class StringEndsWithCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
StringEndsWithCharacteristic() { this = "StringEndsWith" }
|
StringEndsWithCharacteristic() { this = "StringEndsWith" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -467,7 +479,8 @@ private class StringEndsWithCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class StringRegExpTestCharacteristic extends NotASinkCharacteristic,
|
private class StringRegExpTestCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
StringRegExpTestCharacteristic() { this = "StringRegExpTest" }
|
StringRegExpTestCharacteristic() { this = "StringRegExpTest" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -478,7 +491,8 @@ private class StringRegExpTestCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class EventRegistrationCharacteristic extends NotASinkCharacteristic,
|
private class EventRegistrationCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
EventRegistrationCharacteristic() { this = "EventRegistration" }
|
EventRegistrationCharacteristic() { this = "EventRegistration" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -487,7 +501,8 @@ private class EventRegistrationCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class EventDispatchCharacteristic extends NotASinkCharacteristic,
|
private class EventDispatchCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
EventDispatchCharacteristic() { this = "EventDispatch" }
|
EventDispatchCharacteristic() { this = "EventDispatch" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -496,7 +511,8 @@ private class EventDispatchCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class MembershipCandidateTestCharacteristic extends NotASinkCharacteristic,
|
private class MembershipCandidateTestCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
MembershipCandidateTestCharacteristic() { this = "MembershipCandidateTest" }
|
MembershipCandidateTestCharacteristic() { this = "MembershipCandidateTest" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -507,7 +523,8 @@ private class MembershipCandidateTestCharacteristic extends NotASinkCharacterist
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class FileSystemAccessCharacteristic extends NotASinkCharacteristic,
|
private class FileSystemAccessCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
FileSystemAccessCharacteristic() { this = "FileSystemAccess" }
|
FileSystemAccessCharacteristic() { this = "FileSystemAccess" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -516,7 +533,8 @@ private class FileSystemAccessCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class DatabaseAccessCharacteristic extends NotASinkCharacteristic,
|
private class DatabaseAccessCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
DatabaseAccessCharacteristic() { this = "DatabaseAccess" }
|
DatabaseAccessCharacteristic() { this = "DatabaseAccess" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -540,7 +558,8 @@ private class DomCharacteristic extends NotASinkCharacteristic, OtherModeledArgu
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class NextFunctionCallCharacteristic extends NotASinkCharacteristic,
|
private class NextFunctionCallCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
NextFunctionCallCharacteristic() { this = "NextFunctionCall" }
|
NextFunctionCallCharacteristic() { this = "NextFunctionCall" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -552,7 +571,8 @@ private class NextFunctionCallCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class DojoRequireCharacteristic extends NotASinkCharacteristic,
|
private class DojoRequireCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
DojoRequireCharacteristic() { this = "DojoRequire" }
|
DojoRequireCharacteristic() { this = "DojoRequire" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -563,7 +583,8 @@ private class DojoRequireCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class Base64ManipulationCharacteristic extends NotASinkCharacteristic,
|
private class Base64ManipulationCharacteristic extends NotASinkCharacteristic,
|
||||||
OtherModeledArgumentCharacteristic {
|
OtherModeledArgumentCharacteristic
|
||||||
|
{
|
||||||
Base64ManipulationCharacteristic() { this = "Base64Manipulation" }
|
Base64ManipulationCharacteristic() { this = "Base64Manipulation" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -573,7 +594,8 @@ private class Base64ManipulationCharacteristic extends NotASinkCharacteristic,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ArgumentToArrayCharacteristic extends ArgumentToBuiltinFunctionCharacteristic,
|
private class ArgumentToArrayCharacteristic extends ArgumentToBuiltinFunctionCharacteristic,
|
||||||
LikelyNotASinkCharacteristic {
|
LikelyNotASinkCharacteristic
|
||||||
|
{
|
||||||
ArgumentToArrayCharacteristic() { this = "ArgumentToArray" }
|
ArgumentToArrayCharacteristic() { this = "ArgumentToArray" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -588,7 +610,8 @@ private class ArgumentToArrayCharacteristic extends ArgumentToBuiltinFunctionCha
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ArgumentToBuiltinGlobalVarRefCharacteristic extends ArgumentToBuiltinFunctionCharacteristic,
|
private class ArgumentToBuiltinGlobalVarRefCharacteristic extends ArgumentToBuiltinFunctionCharacteristic,
|
||||||
LikelyNotASinkCharacteristic {
|
LikelyNotASinkCharacteristic
|
||||||
|
{
|
||||||
ArgumentToBuiltinGlobalVarRefCharacteristic() { this = "ArgumentToBuiltinGlobalVarRef" }
|
ArgumentToBuiltinGlobalVarRefCharacteristic() { this = "ArgumentToBuiltinGlobalVarRef" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -607,7 +630,8 @@ private class ArgumentToBuiltinGlobalVarRefCharacteristic extends ArgumentToBuil
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ConstantReceiverCharacteristic extends ArgumentToBuiltinFunctionCharacteristic,
|
private class ConstantReceiverCharacteristic extends ArgumentToBuiltinFunctionCharacteristic,
|
||||||
NotASinkCharacteristic {
|
NotASinkCharacteristic
|
||||||
|
{
|
||||||
ConstantReceiverCharacteristic() { this = "ConstantReceiver" }
|
ConstantReceiverCharacteristic() { this = "ConstantReceiver" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -623,7 +647,8 @@ private class ConstantReceiverCharacteristic extends ArgumentToBuiltinFunctionCh
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class BuiltinCallNameCharacteristic extends ArgumentToBuiltinFunctionCharacteristic,
|
private class BuiltinCallNameCharacteristic extends ArgumentToBuiltinFunctionCharacteristic,
|
||||||
NotASinkCharacteristic {
|
NotASinkCharacteristic
|
||||||
|
{
|
||||||
BuiltinCallNameCharacteristic() { this = "BuiltinCallName" }
|
BuiltinCallNameCharacteristic() { this = "BuiltinCallName" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -684,7 +709,8 @@ class IsArgumentToModeledFunctionCharacteristic extends StandardEndpointFilterCh
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class IsArgumentToSinklessLibraryCharacteristic extends StandardEndpointFilterCharacteristic {
|
private class IsArgumentToSinklessLibraryCharacteristic extends StandardEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
IsArgumentToSinklessLibraryCharacteristic() { this = "argument to sinkless library" }
|
IsArgumentToSinklessLibraryCharacteristic() { this = "argument to sinkless library" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -750,7 +776,8 @@ private class InIrrelevantFileCharacteristic extends StandardEndpointFilterChara
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** An EndpointFilterCharacteristic that indicates that an endpoint is unlikely to be a NoSQL injection sink. */
|
/** An EndpointFilterCharacteristic that indicates that an endpoint is unlikely to be a NoSQL injection sink. */
|
||||||
abstract private class NosqlInjectionSinkEndpointFilterCharacteristic extends EndpointFilterCharacteristic {
|
abstract private class NosqlInjectionSinkEndpointFilterCharacteristic extends EndpointFilterCharacteristic
|
||||||
|
{
|
||||||
bindingset[this]
|
bindingset[this]
|
||||||
NosqlInjectionSinkEndpointFilterCharacteristic() { any() }
|
NosqlInjectionSinkEndpointFilterCharacteristic() { any() }
|
||||||
|
|
||||||
@@ -763,7 +790,8 @@ abstract private class NosqlInjectionSinkEndpointFilterCharacteristic extends En
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class DatabaseAccessCallHeuristicCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic {
|
private class DatabaseAccessCallHeuristicCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
DatabaseAccessCallHeuristicCharacteristic() { this = "matches database access call heuristic" }
|
DatabaseAccessCallHeuristicCharacteristic() { this = "matches database access call heuristic" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -794,7 +822,8 @@ private class ModeledSinkCharacteristic extends NosqlInjectionSinkEndpointFilter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class PredecessorInModeledFlowStepCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic {
|
private class PredecessorInModeledFlowStepCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
PredecessorInModeledFlowStepCharacteristic() { this = "predecessor in a modeled flow step" }
|
PredecessorInModeledFlowStepCharacteristic() { this = "predecessor in a modeled flow step" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -805,7 +834,8 @@ private class PredecessorInModeledFlowStepCharacteristic extends NosqlInjectionS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ModeledDatabaseAccessCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic {
|
private class ModeledDatabaseAccessCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
ModeledDatabaseAccessCharacteristic() { this = "modeled database access" }
|
ModeledDatabaseAccessCharacteristic() { this = "modeled database access" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -818,7 +848,8 @@ private class ModeledDatabaseAccessCharacteristic extends NosqlInjectionSinkEndp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ReceiverIsHttpRequestExpressionCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic {
|
private class ReceiverIsHttpRequestExpressionCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
ReceiverIsHttpRequestExpressionCharacteristic() { this = "receiver is a HTTP request expression" }
|
ReceiverIsHttpRequestExpressionCharacteristic() { this = "receiver is a HTTP request expression" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -829,7 +860,8 @@ private class ReceiverIsHttpRequestExpressionCharacteristic extends NosqlInjecti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ReceiverIsHttpResponseExpressionCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic {
|
private class ReceiverIsHttpResponseExpressionCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
ReceiverIsHttpResponseExpressionCharacteristic() {
|
ReceiverIsHttpResponseExpressionCharacteristic() {
|
||||||
this = "receiver is a HTTP response expression"
|
this = "receiver is a HTTP response expression"
|
||||||
}
|
}
|
||||||
@@ -842,7 +874,8 @@ private class ReceiverIsHttpResponseExpressionCharacteristic extends NosqlInject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkNosqlCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic {
|
private class NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkNosqlCharacteristic extends NosqlInjectionSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkNosqlCharacteristic() {
|
NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkNosqlCharacteristic() {
|
||||||
this = "not a direct argument to a likely external library call or a heuristic sink (nosql)"
|
this = "not a direct argument to a likely external library call or a heuristic sink (nosql)"
|
||||||
}
|
}
|
||||||
@@ -885,7 +918,8 @@ private class NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkNosqlCh
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** An EndpointFilterCharacteristic that indicates that an endpoint is unlikely to be a SQL injection sink. */
|
/** An EndpointFilterCharacteristic that indicates that an endpoint is unlikely to be a SQL injection sink. */
|
||||||
abstract private class SqlInjectionSinkEndpointFilterCharacteristic extends EndpointFilterCharacteristic {
|
abstract private class SqlInjectionSinkEndpointFilterCharacteristic extends EndpointFilterCharacteristic
|
||||||
|
{
|
||||||
bindingset[this]
|
bindingset[this]
|
||||||
SqlInjectionSinkEndpointFilterCharacteristic() { any() }
|
SqlInjectionSinkEndpointFilterCharacteristic() { any() }
|
||||||
|
|
||||||
@@ -898,7 +932,8 @@ abstract private class SqlInjectionSinkEndpointFilterCharacteristic extends Endp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class PreparedSqlStatementCharacteristic extends SqlInjectionSinkEndpointFilterCharacteristic {
|
private class PreparedSqlStatementCharacteristic extends SqlInjectionSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
PreparedSqlStatementCharacteristic() { this = "prepared SQL statement" }
|
PreparedSqlStatementCharacteristic() { this = "prepared SQL statement" }
|
||||||
|
|
||||||
override predicate appliesToEndpoint(DataFlow::Node n) {
|
override predicate appliesToEndpoint(DataFlow::Node n) {
|
||||||
@@ -932,7 +967,8 @@ private class HtmlOrRenderingCharacteristic extends SqlInjectionSinkEndpointFilt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NotAnArgumentToLikelyExternalLibraryCallOrHeuristicSinkCharacteristic extends SqlInjectionSinkEndpointFilterCharacteristic {
|
private class NotAnArgumentToLikelyExternalLibraryCallOrHeuristicSinkCharacteristic extends SqlInjectionSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
NotAnArgumentToLikelyExternalLibraryCallOrHeuristicSinkCharacteristic() {
|
NotAnArgumentToLikelyExternalLibraryCallOrHeuristicSinkCharacteristic() {
|
||||||
this = "not an argument to a likely external library call or a heuristic sink"
|
this = "not an argument to a likely external library call or a heuristic sink"
|
||||||
}
|
}
|
||||||
@@ -956,7 +992,8 @@ private class NotAnArgumentToLikelyExternalLibraryCallOrHeuristicSinkCharacteris
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** An EndpointFilterCharacteristic that indicates that an endpoint is unlikely to be a tainted path injection sink. */
|
/** An EndpointFilterCharacteristic that indicates that an endpoint is unlikely to be a tainted path injection sink. */
|
||||||
abstract private class TaintedPathSinkEndpointFilterCharacteristic extends EndpointFilterCharacteristic {
|
abstract private class TaintedPathSinkEndpointFilterCharacteristic extends EndpointFilterCharacteristic
|
||||||
|
{
|
||||||
bindingset[this]
|
bindingset[this]
|
||||||
TaintedPathSinkEndpointFilterCharacteristic() { any() }
|
TaintedPathSinkEndpointFilterCharacteristic() { any() }
|
||||||
|
|
||||||
@@ -969,7 +1006,8 @@ abstract private class TaintedPathSinkEndpointFilterCharacteristic extends Endpo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkTaintedPathCharacteristic extends TaintedPathSinkEndpointFilterCharacteristic {
|
private class NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkTaintedPathCharacteristic extends TaintedPathSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkTaintedPathCharacteristic() {
|
NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkTaintedPathCharacteristic() {
|
||||||
this =
|
this =
|
||||||
"not a direct argument to a likely external library call or a heuristic sink (tainted path)"
|
"not a direct argument to a likely external library call or a heuristic sink (tainted path)"
|
||||||
@@ -1021,7 +1059,8 @@ abstract private class XssSinkEndpointFilterCharacteristic extends EndpointFilte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SetStateCallsInReactApplicationsCharacteristic extends XssSinkEndpointFilterCharacteristic {
|
private class SetStateCallsInReactApplicationsCharacteristic extends XssSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
SetStateCallsInReactApplicationsCharacteristic() {
|
SetStateCallsInReactApplicationsCharacteristic() {
|
||||||
this = "setState calls ought to be safe in react applications"
|
this = "setState calls ought to be safe in react applications"
|
||||||
}
|
}
|
||||||
@@ -1031,7 +1070,8 @@ private class SetStateCallsInReactApplicationsCharacteristic extends XssSinkEndp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkXssCharacteristic extends XssSinkEndpointFilterCharacteristic {
|
private class NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkXssCharacteristic extends XssSinkEndpointFilterCharacteristic
|
||||||
|
{
|
||||||
NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkXssCharacteristic() {
|
NotDirectArgumentToLikelyExternalLibraryCallOrHeuristicSinkXssCharacteristic() {
|
||||||
this = "not a direct argument to a likely external library call or a heuristic sink (xss)"
|
this = "not a direct argument to a likely external library call or a heuristic sink (xss)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,7 +204,8 @@ class FileImports extends EndpointFeature, TFileImports {
|
|||||||
* will be treated by tokenization as if they were spaces.
|
* will be treated by tokenization as if they were spaces.
|
||||||
*/
|
*/
|
||||||
class ContextSurroundingFunctionParameters extends EndpointFeature,
|
class ContextSurroundingFunctionParameters extends EndpointFeature,
|
||||||
TContextSurroundingFunctionParameters {
|
TContextSurroundingFunctionParameters
|
||||||
|
{
|
||||||
override string getName() { result = "contextSurroundingFunctionParameters" }
|
override string getName() { result = "contextSurroundingFunctionParameters" }
|
||||||
|
|
||||||
Function getRelevantFunction(DataFlow::Node endpoint) {
|
Function getRelevantFunction(DataFlow::Node endpoint) {
|
||||||
|
|||||||
@@ -64,7 +64,8 @@ class TaintedPathSinkType extends EndpointType, TTaintedPathSinkType {
|
|||||||
|
|
||||||
/** The `ShellCommandInjectionFromEnvironmentSink` class that can be predicted by endpoint scoring models. */
|
/** The `ShellCommandInjectionFromEnvironmentSink` class that can be predicted by endpoint scoring models. */
|
||||||
class ShellCommandInjectionFromEnvironmentSinkType extends EndpointType,
|
class ShellCommandInjectionFromEnvironmentSinkType extends EndpointType,
|
||||||
TShellCommandInjectionFromEnvironmentSinkType {
|
TShellCommandInjectionFromEnvironmentSinkType
|
||||||
|
{
|
||||||
override string getDescription() { result = "ShellCommandInjectionFromEnvironmentSink" }
|
override string getDescription() { result = "ShellCommandInjectionFromEnvironmentSink" }
|
||||||
|
|
||||||
override int getEncoding() { result = 5 }
|
override int getEncoding() { result = 5 }
|
||||||
|
|||||||
@@ -51,7 +51,8 @@ class TaintedPathAtmConfig extends AtmConfig {
|
|||||||
* of barrier guards, we port the barrier guards for the boosted query from the standard library to
|
* of barrier guards, we port the barrier guards for the boosted query from the standard library to
|
||||||
* sanitizer guards here.
|
* sanitizer guards here.
|
||||||
*/
|
*/
|
||||||
private class BarrierGuardNodeAsSanitizerGuardNode extends TaintTracking::LabeledSanitizerGuardNode instanceof TaintedPath::BarrierGuardNode {
|
private class BarrierGuardNodeAsSanitizerGuardNode extends TaintTracking::LabeledSanitizerGuardNode instanceof TaintedPath::BarrierGuardNode
|
||||||
|
{
|
||||||
override predicate sanitizes(boolean outcome, Expr e) {
|
override predicate sanitizes(boolean outcome, Expr e) {
|
||||||
blocks(outcome, e) or blocks(outcome, e, _)
|
blocks(outcome, e) or blocks(outcome, e, _)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ class DomBasedXssAtmConfig extends AtmConfig {
|
|||||||
private import semmle.javascript.security.dataflow.Xss::Shared as Shared
|
private import semmle.javascript.security.dataflow.Xss::Shared as Shared
|
||||||
|
|
||||||
private class PrefixStringSanitizerActivated extends TaintTracking::SanitizerGuardNode,
|
private class PrefixStringSanitizerActivated extends TaintTracking::SanitizerGuardNode,
|
||||||
DomBasedXss::PrefixStringSanitizer {
|
DomBasedXss::PrefixStringSanitizer
|
||||||
|
{
|
||||||
PrefixStringSanitizerActivated() { this = this }
|
PrefixStringSanitizerActivated() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,6 +53,7 @@ private class QuoteGuard extends TaintTracking::SanitizerGuardNode, Shared::Quot
|
|||||||
QuoteGuard() { this = this }
|
QuoteGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard {
|
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard
|
||||||
|
{
|
||||||
ContainsHtmlGuard() { this = this }
|
ContainsHtmlGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ class TypeTestGuard extends TaintTracking::SanitizerGuardNode, DataFlow::ValueNo
|
|||||||
private import semmle.javascript.security.dataflow.Xss::Shared as Shared
|
private import semmle.javascript.security.dataflow.Xss::Shared as Shared
|
||||||
|
|
||||||
private class PrefixStringSanitizer extends TaintTracking::SanitizerGuardNode,
|
private class PrefixStringSanitizer extends TaintTracking::SanitizerGuardNode,
|
||||||
DomBasedXss::PrefixStringSanitizer {
|
DomBasedXss::PrefixStringSanitizer
|
||||||
|
{
|
||||||
PrefixStringSanitizer() { this = this }
|
PrefixStringSanitizer() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,6 +84,7 @@ private class QuoteGuard extends TaintTracking::SanitizerGuardNode, Shared::Quot
|
|||||||
QuoteGuard() { this = this }
|
QuoteGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard {
|
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard
|
||||||
|
{
|
||||||
ContainsHtmlGuard() { this = this }
|
ContainsHtmlGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class XssThroughDomQuery extends Query, TXssThroughDomQuery {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class ShellCommandInjectionFromEnvironmentQuery extends Query,
|
class ShellCommandInjectionFromEnvironmentQuery extends Query,
|
||||||
TShellCommandInjectionFromEnvironmentQuery {
|
TShellCommandInjectionFromEnvironmentQuery
|
||||||
|
{
|
||||||
override string getName() { result = "ShellCommandInjectionFromEnvironment" }
|
override string getName() { result = "ShellCommandInjectionFromEnvironment" }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ module Closure {
|
|||||||
* A call to a method on the `goog.` namespace, as a closure reference.
|
* A call to a method on the `goog.` namespace, as a closure reference.
|
||||||
*/
|
*/
|
||||||
abstract private class DefaultNamespaceRef extends DataFlow::MethodCallNode,
|
abstract private class DefaultNamespaceRef extends DataFlow::MethodCallNode,
|
||||||
ClosureNamespaceRef::Range {
|
ClosureNamespaceRef::Range
|
||||||
|
{
|
||||||
DefaultNamespaceRef() { this = DataFlow::globalVarRef("goog").getAMethodCall() }
|
DefaultNamespaceRef() { this = DataFlow::globalVarRef("goog").getAMethodCall() }
|
||||||
|
|
||||||
override string getClosureNamespace() { result = getArgument(0).getStringValue() }
|
override string getClosureNamespace() { result = getArgument(0).getStringValue() }
|
||||||
@@ -75,21 +76,22 @@ module Closure {
|
|||||||
/**
|
/**
|
||||||
* A top-level call to `goog.provide`.
|
* A top-level call to `goog.provide`.
|
||||||
*/
|
*/
|
||||||
class ClosureProvideCall extends ClosureNamespaceRef, DataFlow::MethodCallNode instanceof DefaultClosureProvideCall {
|
class ClosureProvideCall extends ClosureNamespaceRef, DataFlow::MethodCallNode instanceof DefaultClosureProvideCall
|
||||||
}
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A call to `goog.require`.
|
* A call to `goog.require`.
|
||||||
*/
|
*/
|
||||||
private class DefaultClosureRequireCall extends DefaultNamespaceRef, ClosureNamespaceAccess::Range {
|
private class DefaultClosureRequireCall extends DefaultNamespaceRef, ClosureNamespaceAccess::Range
|
||||||
|
{
|
||||||
DefaultClosureRequireCall() { getMethodName() = "require" }
|
DefaultClosureRequireCall() { getMethodName() = "require" }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A call to `goog.require`.
|
* A call to `goog.require`.
|
||||||
*/
|
*/
|
||||||
class ClosureRequireCall extends ClosureNamespaceAccess, DataFlow::MethodCallNode instanceof DefaultClosureRequireCall {
|
class ClosureRequireCall extends ClosureNamespaceAccess, DataFlow::MethodCallNode instanceof DefaultClosureRequireCall
|
||||||
}
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A top-level call to `goog.module` or `goog.declareModuleId`.
|
* A top-level call to `goog.module` or `goog.declareModuleId`.
|
||||||
@@ -104,8 +106,8 @@ module Closure {
|
|||||||
/**
|
/**
|
||||||
* A top-level call to `goog.module` or `goog.declareModuleId`.
|
* A top-level call to `goog.module` or `goog.declareModuleId`.
|
||||||
*/
|
*/
|
||||||
class ClosureModuleDeclaration extends ClosureNamespaceRef, DataFlow::MethodCallNode instanceof DefaultClosureModuleDeclaration {
|
class ClosureModuleDeclaration extends ClosureNamespaceRef, DataFlow::MethodCallNode instanceof DefaultClosureModuleDeclaration
|
||||||
}
|
{ }
|
||||||
|
|
||||||
private GlobalVariable googVariable() { variables(result, "goog", any(GlobalScope sc)) }
|
private GlobalVariable googVariable() { variables(result, "goog", any(GlobalScope sc)) }
|
||||||
|
|
||||||
|
|||||||
@@ -124,7 +124,8 @@ module Cryptography {
|
|||||||
* Extend this class to refine existing API models. If you want to model new APIs,
|
* Extend this class to refine existing API models. If you want to model new APIs,
|
||||||
* extend `CryptographicOperation::Range` instead.
|
* extend `CryptographicOperation::Range` instead.
|
||||||
*/
|
*/
|
||||||
class CryptographicOperation extends SC::CryptographicOperation instanceof CryptographicOperation::Range {
|
class CryptographicOperation extends SC::CryptographicOperation instanceof CryptographicOperation::Range
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* DEPRECATED. This predicate has been renamed to `getAnInput`.
|
* DEPRECATED. This predicate has been renamed to `getAnInput`.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ module DOM {
|
|||||||
/**
|
/**
|
||||||
* An HTML element, viewed as an `ElementDefinition`.
|
* An HTML element, viewed as an `ElementDefinition`.
|
||||||
*/
|
*/
|
||||||
private class HtmlElementDefinition extends ElementDefinition, @xmlelement instanceof HTML::Element {
|
private class HtmlElementDefinition extends ElementDefinition, @xmlelement instanceof HTML::Element
|
||||||
|
{
|
||||||
override string getName() { result = HTML::Element.super.getName() }
|
override string getName() { result = HTML::Element.super.getName() }
|
||||||
|
|
||||||
override AttributeDefinition getAttribute(int i) {
|
override AttributeDefinition getAttribute(int i) {
|
||||||
@@ -127,7 +128,8 @@ module DOM {
|
|||||||
/**
|
/**
|
||||||
* An HTML attribute, viewed as an `AttributeDefinition`.
|
* An HTML attribute, viewed as an `AttributeDefinition`.
|
||||||
*/
|
*/
|
||||||
private class HtmlAttributeDefinition extends AttributeDefinition, @xmlattribute instanceof HTML::Attribute {
|
private class HtmlAttributeDefinition extends AttributeDefinition, @xmlattribute instanceof HTML::Attribute
|
||||||
|
{
|
||||||
override string getName() { result = HTML::Attribute.super.getName() }
|
override string getName() { result = HTML::Attribute.super.getName() }
|
||||||
|
|
||||||
override string getStringValue() { result = super.getValue() }
|
override string getStringValue() { result = super.getValue() }
|
||||||
@@ -138,7 +140,8 @@ module DOM {
|
|||||||
/**
|
/**
|
||||||
* A JSX attribute, viewed as an `AttributeDefinition`.
|
* A JSX attribute, viewed as an `AttributeDefinition`.
|
||||||
*/
|
*/
|
||||||
private class JsxAttributeDefinition extends AttributeDefinition, @jsx_attribute instanceof JsxAttribute {
|
private class JsxAttributeDefinition extends AttributeDefinition, @jsx_attribute instanceof JsxAttribute
|
||||||
|
{
|
||||||
override string getName() { result = JsxAttribute.super.getName() }
|
override string getName() { result = JsxAttribute.super.getName() }
|
||||||
|
|
||||||
override DataFlow::Node getValueNode() {
|
override DataFlow::Node getValueNode() {
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ import javascript
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
class Function extends @function, Parameterized, TypeParameterized, StmtContainer, Documentable,
|
class Function extends @function, Parameterized, TypeParameterized, StmtContainer, Documentable,
|
||||||
AST::ValueNode {
|
AST::ValueNode
|
||||||
|
{
|
||||||
/** Gets the `i`th parameter of this function. */
|
/** Gets the `i`th parameter of this function. */
|
||||||
Parameter getParameter(int i) { result = this.getChildExpr(i) }
|
Parameter getParameter(int i) { result = this.getChildExpr(i) }
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ abstract class GeneratedCodeMarkerComment extends Comment { }
|
|||||||
/**
|
/**
|
||||||
* A source mapping comment, viewed as a marker comment indicating generated code.
|
* A source mapping comment, viewed as a marker comment indicating generated code.
|
||||||
*/
|
*/
|
||||||
private class SourceMappingCommentMarkerComment extends GeneratedCodeMarkerComment instanceof SourceMappingComment {
|
private class SourceMappingCommentMarkerComment extends GeneratedCodeMarkerComment instanceof SourceMappingComment
|
||||||
}
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A marker comment left by a known code generator.
|
* A marker comment left by a known code generator.
|
||||||
|
|||||||
@@ -220,7 +220,8 @@ module MembershipCandidate {
|
|||||||
* A candidate that may be a property name of an object.
|
* A candidate that may be a property name of an object.
|
||||||
*/
|
*/
|
||||||
class ObjectPropertyNameMembershipCandidate extends MembershipCandidate::Range,
|
class ObjectPropertyNameMembershipCandidate extends MembershipCandidate::Range,
|
||||||
DataFlow::ValueNode {
|
DataFlow::ValueNode
|
||||||
|
{
|
||||||
Expr test;
|
Expr test;
|
||||||
Expr membersNode;
|
Expr membersNode;
|
||||||
|
|
||||||
|
|||||||
@@ -616,7 +616,8 @@ module Bluebird {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class BluebirdCoroutineDefinitionAsPartialInvoke extends DataFlow::PartialInvokeNode::Range,
|
private class BluebirdCoroutineDefinitionAsPartialInvoke extends DataFlow::PartialInvokeNode::Range,
|
||||||
BluebirdCoroutineDefinition {
|
BluebirdCoroutineDefinition
|
||||||
|
{
|
||||||
override DataFlow::SourceNode getBoundFunction(DataFlow::Node callback, int boundArgs) {
|
override DataFlow::SourceNode getBoundFunction(DataFlow::Node callback, int boundArgs) {
|
||||||
boundArgs = 0 and
|
boundArgs = 0 and
|
||||||
callback = this.getArgument(0) and
|
callback = this.getArgument(0) and
|
||||||
|
|||||||
@@ -508,7 +508,8 @@ module Routing {
|
|||||||
/**
|
/**
|
||||||
* An array which has been determined to be a route node, seen as a route node with arguments.
|
* An array which has been determined to be a route node, seen as a route node with arguments.
|
||||||
*/
|
*/
|
||||||
private class ImpliedArrayRoute extends ValueNode::WithArguments, DataFlow::ArrayCreationNode instanceof ValueNode::UseSite {
|
private class ImpliedArrayRoute extends ValueNode::WithArguments, DataFlow::ArrayCreationNode instanceof ValueNode::UseSite
|
||||||
|
{
|
||||||
override DataFlow::Node getArgumentNode(int n) { result = this.getElement(n) }
|
override DataFlow::Node getArgumentNode(int n) { result = this.getElement(n) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ class DirectEval extends CallExpr {
|
|||||||
* argument as the receiver to the callback.
|
* argument as the receiver to the callback.
|
||||||
*/
|
*/
|
||||||
private class ArrayIterationCallbackAsPartialInvoke extends DataFlow::PartialInvokeNode::Range,
|
private class ArrayIterationCallbackAsPartialInvoke extends DataFlow::PartialInvokeNode::Range,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
ArrayIterationCallbackAsPartialInvoke() {
|
ArrayIterationCallbackAsPartialInvoke() {
|
||||||
this.getNumArgument() = 2 and
|
this.getNumArgument() = 2 and
|
||||||
// Filter out library methods named 'forEach' etc
|
// Filter out library methods named 'forEach' etc
|
||||||
|
|||||||
@@ -1470,7 +1470,8 @@ class NamespaceAccess extends TypeExpr, NamespaceRef, @namespace_access {
|
|||||||
* An identifier that refers to a namespace from inside a type annotation.
|
* An identifier that refers to a namespace from inside a type annotation.
|
||||||
*/
|
*/
|
||||||
class LocalNamespaceAccess extends NamespaceAccess, LexicalAccess, Identifier,
|
class LocalNamespaceAccess extends NamespaceAccess, LexicalAccess, Identifier,
|
||||||
@local_namespace_access {
|
@local_namespace_access
|
||||||
|
{
|
||||||
override Identifier getIdentifier() { result = this }
|
override Identifier getIdentifier() { result = this }
|
||||||
|
|
||||||
/** Gets the local name being accessed. */
|
/** Gets the local name being accessed. */
|
||||||
|
|||||||
@@ -117,7 +117,8 @@ private class IntRefinement extends NumberRefinement, NumberLiteral {
|
|||||||
* A use of the global variable `undefined`, viewed as a refinement expression.
|
* A use of the global variable `undefined`, viewed as a refinement expression.
|
||||||
*/
|
*/
|
||||||
private class UndefinedInRefinement extends RefinementCandidate,
|
private class UndefinedInRefinement extends RefinementCandidate,
|
||||||
SyntacticConstants::UndefinedConstant {
|
SyntacticConstants::UndefinedConstant
|
||||||
|
{
|
||||||
override SsaSourceVariable getARefinedVar() { none() }
|
override SsaSourceVariable getARefinedVar() { none() }
|
||||||
|
|
||||||
override RefinementValue eval(RefinementContext ctxt) {
|
override RefinementValue eval(RefinementContext ctxt) {
|
||||||
|
|||||||
@@ -1005,7 +1005,8 @@ module TaintTracking {
|
|||||||
* Note that the `includes` method is covered by `MembershipTestSanitizer`.
|
* Note that the `includes` method is covered by `MembershipTestSanitizer`.
|
||||||
*/
|
*/
|
||||||
class WhitelistContainmentCallSanitizer extends AdditionalSanitizerGuardNode,
|
class WhitelistContainmentCallSanitizer extends AdditionalSanitizerGuardNode,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
WhitelistContainmentCallSanitizer() {
|
WhitelistContainmentCallSanitizer() {
|
||||||
this.getMethodName() = ["contains", "has", "hasOwnProperty", "hasOwn"]
|
this.getMethodName() = ["contains", "has", "hasOwnProperty", "hasOwn"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,8 @@ abstract class AnalyzedPropertyWrite extends DataFlow::Node {
|
|||||||
/**
|
/**
|
||||||
* Flow analysis for property writes.
|
* Flow analysis for property writes.
|
||||||
*/
|
*/
|
||||||
private class AnalyzedExplicitPropertyWrite extends AnalyzedPropertyWrite instanceof DataFlow::PropWrite {
|
private class AnalyzedExplicitPropertyWrite extends AnalyzedPropertyWrite instanceof DataFlow::PropWrite
|
||||||
|
{
|
||||||
override predicate writes(AbstractValue base, string prop, DataFlow::AnalyzedNode source) {
|
override predicate writes(AbstractValue base, string prop, DataFlow::AnalyzedNode source) {
|
||||||
explicitPropertyWrite(this, base, prop, source)
|
explicitPropertyWrite(this, base, prop, source)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -690,7 +690,8 @@ abstract private class CallWithAnalyzedParameters extends FunctionWithAnalyzedPa
|
|||||||
/**
|
/**
|
||||||
* Flow analysis for simple parameters of IIFEs.
|
* Flow analysis for simple parameters of IIFEs.
|
||||||
*/
|
*/
|
||||||
private class IifeWithAnalyzedParameters extends CallWithAnalyzedParameters instanceof ImmediatelyInvokedFunctionExpr {
|
private class IifeWithAnalyzedParameters extends CallWithAnalyzedParameters instanceof ImmediatelyInvokedFunctionExpr
|
||||||
|
{
|
||||||
IifeWithAnalyzedParameters() { super.getInvocationKind() = "direct" }
|
IifeWithAnalyzedParameters() { super.getInvocationKind() = "direct" }
|
||||||
|
|
||||||
override DataFlow::InvokeNode getAnInvocation() { result = super.getInvocation().flow() }
|
override DataFlow::InvokeNode getAnInvocation() { result = super.getInvocation().flow() }
|
||||||
@@ -711,7 +712,8 @@ private class IifeWithAnalyzedParameters extends CallWithAnalyzedParameters inst
|
|||||||
/**
|
/**
|
||||||
* Enables inter-procedural type inference for `LocalFunction`.
|
* Enables inter-procedural type inference for `LocalFunction`.
|
||||||
*/
|
*/
|
||||||
private class LocalFunctionWithAnalyzedParameters extends CallWithAnalyzedParameters instanceof LocalFunction {
|
private class LocalFunctionWithAnalyzedParameters extends CallWithAnalyzedParameters instanceof LocalFunction
|
||||||
|
{
|
||||||
override DataFlow::InvokeNode getAnInvocation() { result = LocalFunction.super.getAnInvocation() }
|
override DataFlow::InvokeNode getAnInvocation() { result = LocalFunction.super.getAnInvocation() }
|
||||||
|
|
||||||
override predicate isIncomplete(DataFlow::Incompleteness cause) { none() }
|
override predicate isIncomplete(DataFlow::Incompleteness cause) { none() }
|
||||||
|
|||||||
@@ -226,7 +226,8 @@ abstract class ScriptDependency extends Dependency {
|
|||||||
/**
|
/**
|
||||||
* An embedded JavaScript library included inside a `<script>` tag.
|
* An embedded JavaScript library included inside a `<script>` tag.
|
||||||
*/
|
*/
|
||||||
class InlineScriptDependency extends ScriptDependency, @toplevel instanceof FrameworkLibraryInstance {
|
class InlineScriptDependency extends ScriptDependency, @toplevel instanceof FrameworkLibraryInstance
|
||||||
|
{
|
||||||
override predicate info(string id, string v) {
|
override predicate info(string id, string v) {
|
||||||
exists(FrameworkLibrary fl |
|
exists(FrameworkLibrary fl |
|
||||||
FrameworkLibraryInstance.super.info(fl, v) and
|
FrameworkLibraryInstance.super.info(fl, v) and
|
||||||
@@ -248,7 +249,8 @@ class InlineScriptDependency extends ScriptDependency, @toplevel instanceof Fram
|
|||||||
* An external JavaScript library referenced via the `src` attribute
|
* An external JavaScript library referenced via the `src` attribute
|
||||||
* of a `<script>` tag.
|
* of a `<script>` tag.
|
||||||
*/
|
*/
|
||||||
class ExternalScriptDependency extends ScriptDependency, @xmlattribute instanceof FrameworkLibraryReference {
|
class ExternalScriptDependency extends ScriptDependency, @xmlattribute instanceof FrameworkLibraryReference
|
||||||
|
{
|
||||||
override predicate info(string id, string v) {
|
override predicate info(string id, string v) {
|
||||||
exists(FrameworkLibrary fl |
|
exists(FrameworkLibrary fl |
|
||||||
FrameworkLibraryReference.super.info(fl, v) and
|
FrameworkLibraryReference.super.info(fl, v) and
|
||||||
|
|||||||
@@ -346,7 +346,8 @@ private class JQueryInstance extends FrameworkLibraryInstance {
|
|||||||
/**
|
/**
|
||||||
* The jQuery Mobile framework.
|
* The jQuery Mobile framework.
|
||||||
*/
|
*/
|
||||||
private class JQueryMobile extends FrameworkLibraryWithGenericUrl, FrameworkLibraryWithMarkerComment {
|
private class JQueryMobile extends FrameworkLibraryWithGenericUrl, FrameworkLibraryWithMarkerComment
|
||||||
|
{
|
||||||
JQueryMobile() { this = "jquery-mobile" }
|
JQueryMobile() { this = "jquery-mobile" }
|
||||||
|
|
||||||
override string getAnAlias() { result = "jquery.mobile" }
|
override string getAnAlias() { result = "jquery.mobile" }
|
||||||
@@ -371,7 +372,8 @@ private class JQueryUI extends FrameworkLibraryWithGenericUrl, FrameworkLibraryW
|
|||||||
* The jQuery TextExt framework.
|
* The jQuery TextExt framework.
|
||||||
*/
|
*/
|
||||||
private class JQueryTextExt extends FrameworkLibraryWithGenericUrl,
|
private class JQueryTextExt extends FrameworkLibraryWithGenericUrl,
|
||||||
FrameworkLibraryWithMarkerComment {
|
FrameworkLibraryWithMarkerComment
|
||||||
|
{
|
||||||
JQueryTextExt() { this = "jquery-textext" }
|
JQueryTextExt() { this = "jquery-textext" }
|
||||||
|
|
||||||
override string getAnAlias() { result = "jquery.textext" }
|
override string getAnAlias() { result = "jquery.textext" }
|
||||||
@@ -387,7 +389,8 @@ private class JQueryTextExt extends FrameworkLibraryWithGenericUrl,
|
|||||||
* The jQuery DataTables framework.
|
* The jQuery DataTables framework.
|
||||||
*/
|
*/
|
||||||
private class JQueryDataTables extends FrameworkLibraryWithGenericUrl,
|
private class JQueryDataTables extends FrameworkLibraryWithGenericUrl,
|
||||||
FrameworkLibraryWithMarkerComment {
|
FrameworkLibraryWithMarkerComment
|
||||||
|
{
|
||||||
JQueryDataTables() { this = "jquery-dataTables" }
|
JQueryDataTables() { this = "jquery-dataTables" }
|
||||||
|
|
||||||
override string getAnAlias() { result = "jquery.dataTables" }
|
override string getAnAlias() { result = "jquery.dataTables" }
|
||||||
@@ -400,7 +403,8 @@ private class JQueryDataTables extends FrameworkLibraryWithGenericUrl,
|
|||||||
/**
|
/**
|
||||||
* The jQuery jsTree framework.
|
* The jQuery jsTree framework.
|
||||||
*/
|
*/
|
||||||
private class JQueryJsTree extends FrameworkLibraryWithGenericUrl, FrameworkLibraryWithMarkerComment {
|
private class JQueryJsTree extends FrameworkLibraryWithGenericUrl, FrameworkLibraryWithMarkerComment
|
||||||
|
{
|
||||||
JQueryJsTree() { this = "jquery-jstree" }
|
JQueryJsTree() { this = "jquery-jstree" }
|
||||||
|
|
||||||
override string getAnAlias() { result = "jquery.jstree" }
|
override string getAnAlias() { result = "jquery.jstree" }
|
||||||
@@ -412,7 +416,8 @@ private class JQueryJsTree extends FrameworkLibraryWithGenericUrl, FrameworkLibr
|
|||||||
* The jQuery Snippet framework.
|
* The jQuery Snippet framework.
|
||||||
*/
|
*/
|
||||||
private class JQuerySnippet extends FrameworkLibraryWithGenericUrl,
|
private class JQuerySnippet extends FrameworkLibraryWithGenericUrl,
|
||||||
FrameworkLibraryWithMarkerComment {
|
FrameworkLibraryWithMarkerComment
|
||||||
|
{
|
||||||
JQuerySnippet() { this = "jquery-snippet" }
|
JQuerySnippet() { this = "jquery-snippet" }
|
||||||
|
|
||||||
override string getAnAlias() { result = "jquery.snippet" }
|
override string getAnAlias() { result = "jquery.snippet" }
|
||||||
|
|||||||
@@ -1013,7 +1013,8 @@ private class RouteInstantiatedController extends Controller instanceof RouteSet
|
|||||||
/**
|
/**
|
||||||
* Dataflow for the arguments of AngularJS dependency-injected functions.
|
* Dataflow for the arguments of AngularJS dependency-injected functions.
|
||||||
*/
|
*/
|
||||||
private class DependencyInjectedArgumentInitializer extends DataFlow::AnalyzedNode instanceof DataFlow::ParameterNode {
|
private class DependencyInjectedArgumentInitializer extends DataFlow::AnalyzedNode instanceof DataFlow::ParameterNode
|
||||||
|
{
|
||||||
DataFlow::AnalyzedNode service;
|
DataFlow::AnalyzedNode service;
|
||||||
|
|
||||||
DependencyInjectedArgumentInitializer() {
|
DependencyInjectedArgumentInitializer() {
|
||||||
|
|||||||
@@ -93,7 +93,8 @@ abstract class InjectableFunction extends DataFlow::ValueNode {
|
|||||||
* An injectable function that does not explicitly list its dependencies,
|
* An injectable function that does not explicitly list its dependencies,
|
||||||
* instead relying on implicit matching by parameter names.
|
* instead relying on implicit matching by parameter names.
|
||||||
*/
|
*/
|
||||||
private class FunctionWithImplicitDependencyAnnotation extends InjectableFunction instanceof DataFlow::FunctionNode {
|
private class FunctionWithImplicitDependencyAnnotation extends InjectableFunction instanceof DataFlow::FunctionNode
|
||||||
|
{
|
||||||
FunctionWithImplicitDependencyAnnotation() {
|
FunctionWithImplicitDependencyAnnotation() {
|
||||||
this.(DataFlow::FunctionNode).flowsTo(any(DependencyInjection d).getAnInjectableFunction()) and
|
this.(DataFlow::FunctionNode).flowsTo(any(DependencyInjection d).getAnInjectableFunction()) and
|
||||||
not exists(getAPropertyDependencyInjection(this))
|
not exists(getAPropertyDependencyInjection(this))
|
||||||
@@ -121,7 +122,8 @@ private DataFlow::PropWrite getAPropertyDependencyInjection(DataFlow::FunctionNo
|
|||||||
* An injectable function with an `$inject` property that lists its
|
* An injectable function with an `$inject` property that lists its
|
||||||
* dependencies.
|
* dependencies.
|
||||||
*/
|
*/
|
||||||
private class FunctionWithInjectProperty extends InjectableFunction instanceof DataFlow::FunctionNode {
|
private class FunctionWithInjectProperty extends InjectableFunction instanceof DataFlow::FunctionNode
|
||||||
|
{
|
||||||
DataFlow::ArrayCreationNode dependencies;
|
DataFlow::ArrayCreationNode dependencies;
|
||||||
|
|
||||||
FunctionWithInjectProperty() {
|
FunctionWithInjectProperty() {
|
||||||
@@ -154,7 +156,8 @@ private class FunctionWithInjectProperty extends InjectableFunction instanceof D
|
|||||||
/**
|
/**
|
||||||
* An injectable function embedded in an array of dependencies.
|
* An injectable function embedded in an array of dependencies.
|
||||||
*/
|
*/
|
||||||
private class FunctionWithExplicitDependencyAnnotation extends InjectableFunction instanceof DataFlow::ArrayCreationNode {
|
private class FunctionWithExplicitDependencyAnnotation extends InjectableFunction instanceof DataFlow::ArrayCreationNode
|
||||||
|
{
|
||||||
DataFlow::FunctionNode function;
|
DataFlow::FunctionNode function;
|
||||||
|
|
||||||
FunctionWithExplicitDependencyAnnotation() {
|
FunctionWithExplicitDependencyAnnotation() {
|
||||||
|
|||||||
@@ -235,7 +235,8 @@ abstract class CustomServiceDefinition extends DataFlow::Node {
|
|||||||
* A definition of a custom AngularJS dependency injection service using a "recipe".
|
* A definition of a custom AngularJS dependency injection service using a "recipe".
|
||||||
*/
|
*/
|
||||||
abstract class RecipeDefinition extends DataFlow::CallNode, CustomServiceDefinition,
|
abstract class RecipeDefinition extends DataFlow::CallNode, CustomServiceDefinition,
|
||||||
DependencyInjection {
|
DependencyInjection
|
||||||
|
{
|
||||||
string methodName;
|
string methodName;
|
||||||
string name;
|
string name;
|
||||||
|
|
||||||
@@ -268,7 +269,8 @@ abstract class RecipeDefinition extends DataFlow::CallNode, CustomServiceDefinit
|
|||||||
* (used through `ng-controller` directives).
|
* (used through `ng-controller` directives).
|
||||||
*/
|
*/
|
||||||
abstract private class CustomSpecialServiceDefinition extends CustomServiceDefinition,
|
abstract private class CustomSpecialServiceDefinition extends CustomServiceDefinition,
|
||||||
DependencyInjection {
|
DependencyInjection
|
||||||
|
{
|
||||||
override DataFlow::Node getAnInjectableFunction() { result = this.getAFactoryFunction() }
|
override DataFlow::Node getAnInjectableFunction() { result = this.getAFactoryFunction() }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -625,7 +627,8 @@ class ProviderRecipeDefinition extends RecipeDefinition {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ProviderRecipeServiceInjection extends DependencyInjection instanceof ProviderRecipeDefinition {
|
private class ProviderRecipeServiceInjection extends DependencyInjection instanceof ProviderRecipeDefinition
|
||||||
|
{
|
||||||
override DataFlow::Node getAnInjectableFunction() { result = super.getAService() }
|
override DataFlow::Node getAnInjectableFunction() { result = super.getAService() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,8 @@ module AsyncPackage {
|
|||||||
* to the first parameter of the final callback, while `result1, result2, ...` are propagated to
|
* to the first parameter of the final callback, while `result1, result2, ...` are propagated to
|
||||||
* the parameters of the following task.
|
* the parameters of the following task.
|
||||||
*/
|
*/
|
||||||
private class WaterfallNextTaskCall extends DataFlow::PartialInvokeNode::Range, DataFlow::CallNode {
|
private class WaterfallNextTaskCall extends DataFlow::PartialInvokeNode::Range, DataFlow::CallNode
|
||||||
|
{
|
||||||
Waterfall waterfall;
|
Waterfall waterfall;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
|||||||
@@ -125,7 +125,8 @@ module Connect {
|
|||||||
/**
|
/**
|
||||||
* An access to a user-controlled Connect request input.
|
* An access to a user-controlled Connect request input.
|
||||||
*/
|
*/
|
||||||
private class RequestInputAccess extends Http::RequestInputAccess instanceof DataFlow::MethodCallNode {
|
private class RequestInputAccess extends Http::RequestInputAccess instanceof DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
RequestNode request;
|
RequestNode request;
|
||||||
string kind;
|
string kind;
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,8 @@ private module JsCookie {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class WriteAccess extends PersistentWriteAccess, DataFlow::CallNode,
|
class WriteAccess extends PersistentWriteAccess, DataFlow::CallNode,
|
||||||
CookieWrites::ClientSideCookieWrite {
|
CookieWrites::ClientSideCookieWrite
|
||||||
|
{
|
||||||
WriteAccess() { this = libMemberCall("set") }
|
WriteAccess() { this = libMemberCall("set") }
|
||||||
|
|
||||||
string getKey() { this.getArgument(0).mayHaveStringValue(result) }
|
string getKey() { this.getArgument(0).mayHaveStringValue(result) }
|
||||||
@@ -192,7 +193,8 @@ private module BrowserCookies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class WriteAccess extends PersistentWriteAccess, DataFlow::CallNode,
|
class WriteAccess extends PersistentWriteAccess, DataFlow::CallNode,
|
||||||
CookieWrites::ClientSideCookieWrite {
|
CookieWrites::ClientSideCookieWrite
|
||||||
|
{
|
||||||
WriteAccess() { this = libMemberCall("set") }
|
WriteAccess() { this = libMemberCall("set") }
|
||||||
|
|
||||||
string getKey() { this.getArgument(0).mayHaveStringValue(result) }
|
string getKey() { this.getArgument(0).mayHaveStringValue(result) }
|
||||||
@@ -242,7 +244,8 @@ private module LibCookie {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class WriteAccess extends PersistentWriteAccess, DataFlow::CallNode,
|
class WriteAccess extends PersistentWriteAccess, DataFlow::CallNode,
|
||||||
CookieWrites::ClientSideCookieWrite {
|
CookieWrites::ClientSideCookieWrite
|
||||||
|
{
|
||||||
WriteAccess() { this = libMemberCall("serialize") }
|
WriteAccess() { this = libMemberCall("serialize") }
|
||||||
|
|
||||||
string getKey() { this.getArgument(0).mayHaveStringValue(result) }
|
string getKey() { this.getArgument(0).mayHaveStringValue(result) }
|
||||||
@@ -271,7 +274,8 @@ private module ExpressCookies {
|
|||||||
/**
|
/**
|
||||||
* A cookie set using `response.cookie` from `express` module (https://expressjs.com/en/api.html#res.cookie).
|
* A cookie set using `response.cookie` from `express` module (https://expressjs.com/en/api.html#res.cookie).
|
||||||
*/
|
*/
|
||||||
private class InsecureExpressCookieResponse extends CookieWrites::CookieWrite instanceof Express::SetCookie {
|
private class InsecureExpressCookieResponse extends CookieWrites::CookieWrite instanceof Express::SetCookie
|
||||||
|
{
|
||||||
override predicate isSecure() {
|
override predicate isSecure() {
|
||||||
// A cookie is secure if there are cookie options with the `secure` flag set to `true`.
|
// A cookie is secure if there are cookie options with the `secure` flag set to `true`.
|
||||||
// The default is `false`.
|
// The default is `false`.
|
||||||
@@ -299,7 +303,8 @@ private module ExpressCookies {
|
|||||||
* A cookie set using the `express` module `cookie-session` (https://github.com/expressjs/cookie-session).
|
* A cookie set using the `express` module `cookie-session` (https://github.com/expressjs/cookie-session).
|
||||||
*/
|
*/
|
||||||
class InsecureCookieSession extends ExpressLibraries::CookieSession::MiddlewareInstance,
|
class InsecureCookieSession extends ExpressLibraries::CookieSession::MiddlewareInstance,
|
||||||
CookieWrites::CookieWrite {
|
CookieWrites::CookieWrite
|
||||||
|
{
|
||||||
private DataFlow::Node getCookieFlagValue(string flag) {
|
private DataFlow::Node getCookieFlagValue(string flag) {
|
||||||
result = this.getOptionArgument(0, flag)
|
result = this.getOptionArgument(0, flag)
|
||||||
}
|
}
|
||||||
@@ -327,7 +332,8 @@ private module ExpressCookies {
|
|||||||
* A cookie set using the `express` module `express-session` (https://github.com/expressjs/session).
|
* A cookie set using the `express` module `express-session` (https://github.com/expressjs/session).
|
||||||
*/
|
*/
|
||||||
class InsecureExpressSessionCookie extends ExpressLibraries::ExpressSession::MiddlewareInstance,
|
class InsecureExpressSessionCookie extends ExpressLibraries::ExpressSession::MiddlewareInstance,
|
||||||
CookieWrites::CookieWrite {
|
CookieWrites::CookieWrite
|
||||||
|
{
|
||||||
private DataFlow::Node getCookieFlagValue(string flag) {
|
private DataFlow::Node getCookieFlagValue(string flag) {
|
||||||
result = this.getOption("cookie").getALocalSource().getAPropertyWrite(flag).getRhs()
|
result = this.getOption("cookie").getALocalSource().getAPropertyWrite(flag).getRhs()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,8 @@ module Electron {
|
|||||||
* except that values can be returned through the `event.returnValue` property.
|
* except that values can be returned through the `event.returnValue` property.
|
||||||
*/
|
*/
|
||||||
class IpcSendRegistration extends EventRegistration::DefaultEventRegistration,
|
class IpcSendRegistration extends EventRegistration::DefaultEventRegistration,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
override Process emitter;
|
override Process emitter;
|
||||||
|
|
||||||
IpcSendRegistration() { this = emitter.ref().getAMethodCall(EventEmitter::on()) }
|
IpcSendRegistration() { this = emitter.ref().getAMethodCall(EventEmitter::on()) }
|
||||||
@@ -178,8 +179,8 @@ module Electron {
|
|||||||
/**
|
/**
|
||||||
* A Node.js-style HTTP or HTTPS request made using an Electron module.
|
* A Node.js-style HTTP or HTTPS request made using an Electron module.
|
||||||
*/
|
*/
|
||||||
class ElectronClientRequest extends NodeJSLib::NodeJSClientRequest instanceof ElectronClientRequest::Range {
|
class ElectronClientRequest extends NodeJSLib::NodeJSClientRequest instanceof ElectronClientRequest::Range
|
||||||
}
|
{ }
|
||||||
|
|
||||||
module ElectronClientRequest {
|
module ElectronClientRequest {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -280,7 +280,8 @@ module Express {
|
|||||||
* The callback given to passport in PassportRouteSetup.
|
* The callback given to passport in PassportRouteSetup.
|
||||||
*/
|
*/
|
||||||
private class PassportRouteHandler extends RouteHandler, Http::Servers::StandardRouteHandler,
|
private class PassportRouteHandler extends RouteHandler, Http::Servers::StandardRouteHandler,
|
||||||
DataFlow::FunctionNode {
|
DataFlow::FunctionNode
|
||||||
|
{
|
||||||
PassportRouteHandler() { this = any(PassportRouteSetup setup).getARouteHandler() }
|
PassportRouteHandler() { this = any(PassportRouteSetup setup).getARouteHandler() }
|
||||||
|
|
||||||
override DataFlow::ParameterNode getRouteHandlerParameter(string kind) {
|
override DataFlow::ParameterNode getRouteHandlerParameter(string kind) {
|
||||||
@@ -496,7 +497,8 @@ module Express {
|
|||||||
* An Express route handler installed by a route setup.
|
* An Express route handler installed by a route setup.
|
||||||
*/
|
*/
|
||||||
class StandardRouteHandler extends RouteHandler, Http::Servers::StandardRouteHandler,
|
class StandardRouteHandler extends RouteHandler, Http::Servers::StandardRouteHandler,
|
||||||
DataFlow::FunctionNode {
|
DataFlow::FunctionNode
|
||||||
|
{
|
||||||
RouteSetup routeSetup;
|
RouteSetup routeSetup;
|
||||||
|
|
||||||
StandardRouteHandler() { this = routeSetup.getARouteHandler() }
|
StandardRouteHandler() { this = routeSetup.getARouteHandler() }
|
||||||
@@ -1014,7 +1016,8 @@ module Express {
|
|||||||
|
|
||||||
/** A call to `response.sendFile`, considered as a file system access. */
|
/** A call to `response.sendFile`, considered as a file system access. */
|
||||||
private class ResponseSendFileAsFileSystemAccess extends FileSystemReadAccess,
|
private class ResponseSendFileAsFileSystemAccess extends FileSystemReadAccess,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
ResponseSendFileAsFileSystemAccess() {
|
ResponseSendFileAsFileSystemAccess() {
|
||||||
exists(string name | name = "sendFile" or name = "sendfile" |
|
exists(string name | name = "sendFile" or name = "sendfile" |
|
||||||
this.calls(any(ResponseNode res), name)
|
this.calls(any(ResponseNode res), name)
|
||||||
@@ -1038,7 +1041,8 @@ module Express {
|
|||||||
* A function that flows to a route setup.
|
* A function that flows to a route setup.
|
||||||
*/
|
*/
|
||||||
private class TrackedRouteHandlerCandidateWithSetup extends RouteHandler,
|
private class TrackedRouteHandlerCandidateWithSetup extends RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler, DataFlow::FunctionNode {
|
Http::Servers::StandardRouteHandler, DataFlow::FunctionNode
|
||||||
|
{
|
||||||
RouteSetup routeSetup;
|
RouteSetup routeSetup;
|
||||||
|
|
||||||
TrackedRouteHandlerCandidateWithSetup() { this = routeSetup.getARouteHandler() }
|
TrackedRouteHandlerCandidateWithSetup() { this = routeSetup.getARouteHandler() }
|
||||||
@@ -1113,7 +1117,8 @@ module Express {
|
|||||||
* A call to the Express `res.render()` method, seen as a template instantiation.
|
* A call to the Express `res.render()` method, seen as a template instantiation.
|
||||||
*/
|
*/
|
||||||
private class RenderCallAsTemplateInstantiation extends Templating::TemplateInstantiation::Range,
|
private class RenderCallAsTemplateInstantiation extends Templating::TemplateInstantiation::Range,
|
||||||
DataFlow::CallNode {
|
DataFlow::CallNode
|
||||||
|
{
|
||||||
ResponseSource res;
|
ResponseSource res;
|
||||||
|
|
||||||
RenderCallAsTemplateInstantiation() { this = res.ref().getAMethodCall("render") }
|
RenderCallAsTemplateInstantiation() { this = res.ref().getAMethodCall("render") }
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ module ExpressLibraries {
|
|||||||
/**
|
/**
|
||||||
* A header produced by a route handler of the "x-frame-options" module.
|
* A header produced by a route handler of the "x-frame-options" module.
|
||||||
*/
|
*/
|
||||||
class XFrameOptionsRouteHandlerHeader extends Http::ImplicitHeaderDefinition instanceof XFrameOptionsRouteHandler {
|
class XFrameOptionsRouteHandlerHeader extends Http::ImplicitHeaderDefinition instanceof XFrameOptionsRouteHandler
|
||||||
|
{
|
||||||
override predicate defines(string headerName, string headerValue) {
|
override predicate defines(string headerName, string headerValue) {
|
||||||
xFrameOptionsDefaultImplicitHeaderDefinition(headerName, headerValue)
|
xFrameOptionsDefaultImplicitHeaderDefinition(headerName, headerValue)
|
||||||
}
|
}
|
||||||
@@ -43,7 +44,8 @@ module ExpressLibraries {
|
|||||||
/**
|
/**
|
||||||
* A header produced by a route handler of the "frameguard" module.
|
* A header produced by a route handler of the "frameguard" module.
|
||||||
*/
|
*/
|
||||||
class FrameGuardRouteHandlerHeader extends Http::ImplicitHeaderDefinition instanceof FrameGuardRouteHandler {
|
class FrameGuardRouteHandlerHeader extends Http::ImplicitHeaderDefinition instanceof FrameGuardRouteHandler
|
||||||
|
{
|
||||||
override predicate defines(string headerName, string headerValue) {
|
override predicate defines(string headerName, string headerValue) {
|
||||||
xFrameOptionsDefaultImplicitHeaderDefinition(headerName, headerValue)
|
xFrameOptionsDefaultImplicitHeaderDefinition(headerName, headerValue)
|
||||||
}
|
}
|
||||||
@@ -66,7 +68,8 @@ module ExpressLibraries {
|
|||||||
/**
|
/**
|
||||||
* A header produced by a route handler of the "helmet" module.
|
* A header produced by a route handler of the "helmet" module.
|
||||||
*/
|
*/
|
||||||
class HelmetRouteHandlerHeader extends Http::ImplicitHeaderDefinition instanceof HelmetRouteHandler {
|
class HelmetRouteHandlerHeader extends Http::ImplicitHeaderDefinition instanceof HelmetRouteHandler
|
||||||
|
{
|
||||||
override predicate defines(string headerName, string headerValue) {
|
override predicate defines(string headerName, string headerValue) {
|
||||||
xFrameOptionsDefaultImplicitHeaderDefinition(headerName, headerValue)
|
xFrameOptionsDefaultImplicitHeaderDefinition(headerName, headerValue)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,7 +168,8 @@ module Fastify {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ShorthandRoutingTreeSetup extends Routing::RouteSetup::MethodCall instanceof RouteSetup {
|
private class ShorthandRoutingTreeSetup extends Routing::RouteSetup::MethodCall instanceof RouteSetup
|
||||||
|
{
|
||||||
ShorthandRoutingTreeSetup() { not this.getMethodName() = "route" }
|
ShorthandRoutingTreeSetup() { not this.getMethodName() = "route" }
|
||||||
|
|
||||||
override string getRelativePath() { result = this.getArgument(0).getStringValue() }
|
override string getRelativePath() { result = this.getArgument(0).getStringValue() }
|
||||||
@@ -350,7 +351,8 @@ module Fastify {
|
|||||||
* An invocation that sets a single header of the HTTP response.
|
* An invocation that sets a single header of the HTTP response.
|
||||||
*/
|
*/
|
||||||
private class SetOneHeader extends Http::Servers::StandardHeaderDefinition,
|
private class SetOneHeader extends Http::Servers::StandardHeaderDefinition,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
RouteHandler rh;
|
RouteHandler rh;
|
||||||
|
|
||||||
SetOneHeader() {
|
SetOneHeader() {
|
||||||
|
|||||||
@@ -216,7 +216,8 @@ module Firebase {
|
|||||||
* A function used as a route handler.
|
* A function used as a route handler.
|
||||||
*/
|
*/
|
||||||
private class RouteHandler extends Express::RouteHandler, Http::Servers::StandardRouteHandler,
|
private class RouteHandler extends Express::RouteHandler, Http::Servers::StandardRouteHandler,
|
||||||
DataFlow::FunctionNode {
|
DataFlow::FunctionNode
|
||||||
|
{
|
||||||
RouteHandler() { this = any(RouteSetup setup).getARouteHandler() }
|
RouteHandler() { this = any(RouteSetup setup).getARouteHandler() }
|
||||||
|
|
||||||
override DataFlow::ParameterNode getRouteHandlerParameter(string kind) {
|
override DataFlow::ParameterNode getRouteHandlerParameter(string kind) {
|
||||||
|
|||||||
@@ -436,7 +436,8 @@ module Http {
|
|||||||
* A standard header definition.
|
* A standard header definition.
|
||||||
*/
|
*/
|
||||||
abstract class StandardHeaderDefinition extends ExplicitHeaderDefinition,
|
abstract class StandardHeaderDefinition extends ExplicitHeaderDefinition,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
override predicate definesHeaderValue(string headerName, DataFlow::Node headerValue) {
|
override predicate definesHeaderValue(string headerName, DataFlow::Node headerValue) {
|
||||||
headerName = this.getNameNode().getStringValue().toLowerCase() and
|
headerName = this.getNameNode().getStringValue().toLowerCase() and
|
||||||
headerValue = this.getArgument(1)
|
headerValue = this.getArgument(1)
|
||||||
@@ -571,7 +572,8 @@ module Http {
|
|||||||
/**
|
/**
|
||||||
* An object that contains one or more potential route handlers.
|
* An object that contains one or more potential route handlers.
|
||||||
*/
|
*/
|
||||||
class RouteHandlerCandidateContainer extends DataFlow::Node instanceof RouteHandlerCandidateContainer::Range {
|
class RouteHandlerCandidateContainer extends DataFlow::Node instanceof RouteHandlerCandidateContainer::Range
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Gets the route handler in this container that is accessed at `access`.
|
* Gets the route handler in this container that is accessed at `access`.
|
||||||
*/
|
*/
|
||||||
@@ -671,7 +673,8 @@ module Http {
|
|||||||
* A collection that contains one or more route potential handlers.
|
* A collection that contains one or more route potential handlers.
|
||||||
*/
|
*/
|
||||||
private class ContainerCollection extends Http::RouteHandlerCandidateContainer::Range,
|
private class ContainerCollection extends Http::RouteHandlerCandidateContainer::Range,
|
||||||
DataFlow::NewNode {
|
DataFlow::NewNode
|
||||||
|
{
|
||||||
ContainerCollection() {
|
ContainerCollection() {
|
||||||
this = DataFlow::globalVarRef("Map").getAnInstantiation() and // restrict to Map for now
|
this = DataFlow::globalVarRef("Map").getAnInstantiation() and // restrict to Map for now
|
||||||
exists(DataFlow::Node use |
|
exists(DataFlow::Node use |
|
||||||
|
|||||||
@@ -285,7 +285,8 @@ module Hapi {
|
|||||||
* A function that looks like a Hapi route handler and flows to a route setup.
|
* A function that looks like a Hapi route handler and flows to a route setup.
|
||||||
*/
|
*/
|
||||||
private class TrackedRouteHandlerCandidateWithSetup extends RouteHandler,
|
private class TrackedRouteHandlerCandidateWithSetup extends RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler, DataFlow::FunctionNode {
|
Http::Servers::StandardRouteHandler, DataFlow::FunctionNode
|
||||||
|
{
|
||||||
TrackedRouteHandlerCandidateWithSetup() { this = any(RouteSetup s).getARouteHandler() }
|
TrackedRouteHandlerCandidateWithSetup() { this = any(RouteSetup s).getARouteHandler() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -470,7 +470,8 @@ module Koa {
|
|||||||
/**
|
/**
|
||||||
* An invocation of the `redirect` method of an HTTP response object.
|
* An invocation of the `redirect` method of an HTTP response object.
|
||||||
*/
|
*/
|
||||||
private class RedirectInvocation extends Http::RedirectInvocation instanceof DataFlow::MethodCallNode {
|
private class RedirectInvocation extends Http::RedirectInvocation instanceof DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
RouteHandler rh;
|
RouteHandler rh;
|
||||||
|
|
||||||
RedirectInvocation() { super.calls(rh.getAResponseOrContextNode(), "redirect") }
|
RedirectInvocation() { super.calls(rh.getAResponseOrContextNode(), "redirect") }
|
||||||
|
|||||||
@@ -178,7 +178,8 @@ module LodashUnderscore {
|
|||||||
* still infer the ordinary abstract value.
|
* still infer the ordinary abstract value.
|
||||||
*/
|
*/
|
||||||
private class LodashCallbackAsPartialInvoke extends DataFlow::PartialInvokeNode::Range,
|
private class LodashCallbackAsPartialInvoke extends DataFlow::PartialInvokeNode::Range,
|
||||||
DataFlow::CallNode {
|
DataFlow::CallNode
|
||||||
|
{
|
||||||
int callbackIndex;
|
int callbackIndex;
|
||||||
int contextIndex;
|
int contextIndex;
|
||||||
|
|
||||||
|
|||||||
@@ -295,7 +295,8 @@ module NestJS {
|
|||||||
* as a source of untrusted data.
|
* as a source of untrusted data.
|
||||||
*/
|
*/
|
||||||
private class NestJSRequestInputAsRequestInputAccess extends NestJSRequestInput,
|
private class NestJSRequestInputAsRequestInputAccess extends NestJSRequestInput,
|
||||||
Http::RequestInputAccess {
|
Http::RequestInputAccess
|
||||||
|
{
|
||||||
NestJSRequestInputAsRequestInputAccess() {
|
NestJSRequestInputAsRequestInputAccess() {
|
||||||
not this.isSanitizedByPipe() and
|
not this.isSanitizedByPipe() and
|
||||||
not this = any(CustomPipeClass cls).getAnAffectedParameter()
|
not this = any(CustomPipeClass cls).getAnAffectedParameter()
|
||||||
@@ -316,7 +317,8 @@ module NestJS {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class NestJSHeaderAccess extends NestJSRequestInputAsRequestInputAccess,
|
private class NestJSHeaderAccess extends NestJSRequestInputAsRequestInputAccess,
|
||||||
Http::RequestHeaderAccess {
|
Http::RequestHeaderAccess
|
||||||
|
{
|
||||||
NestJSHeaderAccess() { decoratorName = "Headers" and decorator.getNumArgument() > 0 }
|
NestJSHeaderAccess() { decoratorName = "Headers" and decorator.getNumArgument() > 0 }
|
||||||
|
|
||||||
override string getAHeaderName() {
|
override string getAHeaderName() {
|
||||||
|
|||||||
@@ -226,7 +226,8 @@ module NextJS {
|
|||||||
* and we therefore model the routehandler as an Express.js routehandler.
|
* and we therefore model the routehandler as an Express.js routehandler.
|
||||||
*/
|
*/
|
||||||
class NextApiRouteHandler extends DataFlow::FunctionNode, Express::RouteHandler,
|
class NextApiRouteHandler extends DataFlow::FunctionNode, Express::RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler {
|
Http::Servers::StandardRouteHandler
|
||||||
|
{
|
||||||
NextApiRouteHandler() {
|
NextApiRouteHandler() {
|
||||||
exists(Module mod | mod.getFile().getParentContainer() = apiFolder() |
|
exists(Module mod | mod.getFile().getParentContainer() = apiFolder() |
|
||||||
this = mod.getAnExportedValue("default").getAFunctionValue()
|
this = mod.getAnExportedValue("default").getAFunctionValue()
|
||||||
|
|||||||
@@ -840,7 +840,8 @@ module NodeJSLib {
|
|||||||
* A function that flows to a route setup.
|
* A function that flows to a route setup.
|
||||||
*/
|
*/
|
||||||
private class TrackedRouteHandlerCandidateWithSetup extends RouteHandler,
|
private class TrackedRouteHandlerCandidateWithSetup extends RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler, DataFlow::FunctionNode {
|
Http::Servers::StandardRouteHandler, DataFlow::FunctionNode
|
||||||
|
{
|
||||||
TrackedRouteHandlerCandidateWithSetup() { this = any(RouteSetup s).getARouteHandler() }
|
TrackedRouteHandlerCandidateWithSetup() { this = any(RouteSetup s).getARouteHandler() }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1163,7 +1164,8 @@ module NodeJSLib {
|
|||||||
* A registration of an event handler on a NodeJS EventEmitter instance.
|
* A registration of an event handler on a NodeJS EventEmitter instance.
|
||||||
*/
|
*/
|
||||||
private class NodeJSEventRegistration extends EventRegistration::DefaultEventRegistration,
|
private class NodeJSEventRegistration extends EventRegistration::DefaultEventRegistration,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
override NodeJSEventEmitter emitter;
|
override NodeJSEventEmitter emitter;
|
||||||
|
|
||||||
NodeJSEventRegistration() { this = emitter.ref().getAMethodCall(EventEmitter::on()) }
|
NodeJSEventRegistration() { this = emitter.ref().getAMethodCall(EventEmitter::on()) }
|
||||||
@@ -1173,7 +1175,8 @@ module NodeJSLib {
|
|||||||
* A dispatch of an event on a NodeJS EventEmitter instance.
|
* A dispatch of an event on a NodeJS EventEmitter instance.
|
||||||
*/
|
*/
|
||||||
private class NodeJSEventDispatch extends EventDispatch::DefaultEventDispatch,
|
private class NodeJSEventDispatch extends EventDispatch::DefaultEventDispatch,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
override NodeJSEventEmitter emitter;
|
override NodeJSEventEmitter emitter;
|
||||||
|
|
||||||
NodeJSEventDispatch() { this = emitter.ref().getAMethodCall("emit") }
|
NodeJSEventDispatch() { this = emitter.ref().getAMethodCall("emit") }
|
||||||
@@ -1223,7 +1226,8 @@ module NodeJSLib {
|
|||||||
* A registration of an event handler on a NodeJS net server instance.
|
* A registration of an event handler on a NodeJS net server instance.
|
||||||
*/
|
*/
|
||||||
private class NodeJSNetServerRegistration extends EventRegistration::DefaultEventRegistration,
|
private class NodeJSNetServerRegistration extends EventRegistration::DefaultEventRegistration,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
override NodeJSNetServerConnection emitter;
|
override NodeJSNetServerConnection emitter;
|
||||||
|
|
||||||
NodeJSNetServerRegistration() { this = emitter.ref().getAMethodCall(EventEmitter::on()) }
|
NodeJSNetServerRegistration() { this = emitter.ref().getAMethodCall(EventEmitter::on()) }
|
||||||
|
|||||||
@@ -417,7 +417,8 @@ private class DefinitePreactComponent extends PreactComponent {
|
|||||||
* - has a `render` method that returns JSX or React elements.
|
* - has a `render` method that returns JSX or React elements.
|
||||||
*/
|
*/
|
||||||
private class HeuristicReactPreactComponent extends ClassDefinition, PreactComponent,
|
private class HeuristicReactPreactComponent extends ClassDefinition, PreactComponent,
|
||||||
ES2015Component {
|
ES2015Component
|
||||||
|
{
|
||||||
HeuristicReactPreactComponent() {
|
HeuristicReactPreactComponent() {
|
||||||
any(DataFlow::GlobalVarRefNode c | c.getName() = "Component").flowsToExpr(getSuperClass()) and
|
any(DataFlow::GlobalVarRefNode c | c.getName() = "Component").flowsToExpr(getSuperClass()) and
|
||||||
alwaysReturnsJsxOrReactElements(ClassDefinition.super.getInstanceMethod("render"))
|
alwaysReturnsJsxOrReactElements(ClassDefinition.super.getInstanceMethod("render"))
|
||||||
@@ -528,7 +529,8 @@ private class FactoryDefinition extends ReactElementDefinition {
|
|||||||
* that binds `this` of a callback.
|
* that binds `this` of a callback.
|
||||||
*/
|
*/
|
||||||
private class ReactCallbackPartialInvoke extends DataFlow::PartialInvokeNode::Range,
|
private class ReactCallbackPartialInvoke extends DataFlow::PartialInvokeNode::Range,
|
||||||
DataFlow::CallNode {
|
DataFlow::CallNode
|
||||||
|
{
|
||||||
ReactCallbackPartialInvoke() {
|
ReactCallbackPartialInvoke() {
|
||||||
exists(string name |
|
exists(string name |
|
||||||
// React.Children.map or React.Children.forEach
|
// React.Children.map or React.Children.forEach
|
||||||
|
|||||||
@@ -138,7 +138,8 @@ module Restify {
|
|||||||
/**
|
/**
|
||||||
* An access to a header on a Restify request.
|
* An access to a header on a Restify request.
|
||||||
*/
|
*/
|
||||||
private class RequestHeaderAccess extends Http::RequestHeaderAccess instanceof DataFlow::MethodCallNode {
|
private class RequestHeaderAccess extends Http::RequestHeaderAccess instanceof DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
RouteHandler rh;
|
RouteHandler rh;
|
||||||
|
|
||||||
RequestHeaderAccess() {
|
RequestHeaderAccess() {
|
||||||
@@ -175,7 +176,8 @@ module Restify {
|
|||||||
* An invocation that sets any number of headers of the HTTP response.
|
* An invocation that sets any number of headers of the HTTP response.
|
||||||
*/
|
*/
|
||||||
private class MultipleHeaderDefinitions extends Http::ExplicitHeaderDefinition,
|
private class MultipleHeaderDefinitions extends Http::ExplicitHeaderDefinition,
|
||||||
DataFlow::MethodCallNode {
|
DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
MultipleHeaderDefinitions() {
|
MultipleHeaderDefinitions() {
|
||||||
// res.set({'Cache-Control': 'no-cache'})
|
// res.set({'Cache-Control': 'no-cache'})
|
||||||
this.getReceiver() instanceof ResponseNode and
|
this.getReceiver() instanceof ResponseNode and
|
||||||
@@ -416,7 +418,8 @@ module Restify {
|
|||||||
* A header produced by a formatter
|
* A header produced by a formatter
|
||||||
*/
|
*/
|
||||||
private class FormatterContentTypeHeader extends Http::ImplicitHeaderDefinition,
|
private class FormatterContentTypeHeader extends Http::ImplicitHeaderDefinition,
|
||||||
DataFlow::FunctionNode instanceof FormatterHandler {
|
DataFlow::FunctionNode instanceof FormatterHandler
|
||||||
|
{
|
||||||
string contentType;
|
string contentType;
|
||||||
|
|
||||||
FormatterContentTypeHeader() {
|
FormatterContentTypeHeader() {
|
||||||
@@ -437,7 +440,8 @@ module Restify {
|
|||||||
* A header produced by a route handler with no explicit declaration of a Content-Type.
|
* A header produced by a route handler with no explicit declaration of a Content-Type.
|
||||||
*/
|
*/
|
||||||
private class ContentTypeRouteHandlerHeader extends Http::ImplicitHeaderDefinition,
|
private class ContentTypeRouteHandlerHeader extends Http::ImplicitHeaderDefinition,
|
||||||
DataFlow::FunctionNode instanceof RouteHandler {
|
DataFlow::FunctionNode instanceof RouteHandler
|
||||||
|
{
|
||||||
override predicate defines(string headerName, string headerValue) {
|
override predicate defines(string headerName, string headerValue) {
|
||||||
headerName = "content-type" and headerValue = "application/json"
|
headerName = "content-type" and headerValue = "application/json"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,7 +193,8 @@ module Spife {
|
|||||||
/**
|
/**
|
||||||
* An access to a user-controlled Spife context input.
|
* An access to a user-controlled Spife context input.
|
||||||
*/
|
*/
|
||||||
private class ContextInputAccess extends Http::RequestInputAccess instanceof DataFlow::MethodCallNode {
|
private class ContextInputAccess extends Http::RequestInputAccess instanceof DataFlow::MethodCallNode
|
||||||
|
{
|
||||||
ContextSource request;
|
ContextSource request;
|
||||||
string kind;
|
string kind;
|
||||||
|
|
||||||
@@ -276,7 +277,8 @@ module Spife {
|
|||||||
/**
|
/**
|
||||||
* An invocation that sets any number of headers of the HTTP response.
|
* An invocation that sets any number of headers of the HTTP response.
|
||||||
*/
|
*/
|
||||||
private class MultipleHeaderDefinitions extends Http::ExplicitHeaderDefinition instanceof ReplyCall {
|
private class MultipleHeaderDefinitions extends Http::ExplicitHeaderDefinition instanceof ReplyCall
|
||||||
|
{
|
||||||
MultipleHeaderDefinitions() {
|
MultipleHeaderDefinitions() {
|
||||||
(
|
(
|
||||||
// reply.header(RESPONSE, {'Cache-Control': 'no-cache'})
|
// reply.header(RESPONSE, {'Cache-Control': 'no-cache'})
|
||||||
@@ -312,7 +314,8 @@ module Spife {
|
|||||||
/**
|
/**
|
||||||
* A header produced by a route handler with no explicit declaration of a Content-Type.
|
* A header produced by a route handler with no explicit declaration of a Content-Type.
|
||||||
*/
|
*/
|
||||||
private class ContentTypeRouteHandlerHeader extends Http::ImplicitHeaderDefinition instanceof RouteHandler {
|
private class ContentTypeRouteHandlerHeader extends Http::ImplicitHeaderDefinition instanceof RouteHandler
|
||||||
|
{
|
||||||
override predicate defines(string headerName, string headerValue) {
|
override predicate defines(string headerName, string headerValue) {
|
||||||
headerName = "content-type" and headerValue = "application/json"
|
headerName = "content-type" and headerValue = "application/json"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,19 +11,21 @@ private import semmle.javascript.frameworks.ConnectExpressShared
|
|||||||
* Add `NodeJSLib::RouteHandlerCandidate` to the extent of `NodeJSLib::RouteHandler`.
|
* Add `NodeJSLib::RouteHandlerCandidate` to the extent of `NodeJSLib::RouteHandler`.
|
||||||
*/
|
*/
|
||||||
private class PromotedNodeJSLibCandidate extends NodeJSLib::RouteHandler,
|
private class PromotedNodeJSLibCandidate extends NodeJSLib::RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler instanceof NodeJSLib::RouteHandlerCandidate { }
|
Http::Servers::StandardRouteHandler instanceof NodeJSLib::RouteHandlerCandidate
|
||||||
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add `Hapi::RouteHandlerCandidate` to the extent of `Hapi::RouteHandler`.
|
* Add `Hapi::RouteHandlerCandidate` to the extent of `Hapi::RouteHandler`.
|
||||||
*/
|
*/
|
||||||
private class PromotedHapiCandidate extends Hapi::RouteHandler, Http::Servers::StandardRouteHandler instanceof Hapi::RouteHandlerCandidate {
|
private class PromotedHapiCandidate extends Hapi::RouteHandler, Http::Servers::StandardRouteHandler instanceof Hapi::RouteHandlerCandidate
|
||||||
}
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add `ConnectExpressShared::RouteHandlerCandidate` to the extent of `Express::RouteHandler`.
|
* Add `ConnectExpressShared::RouteHandlerCandidate` to the extent of `Express::RouteHandler`.
|
||||||
*/
|
*/
|
||||||
private class PromotedExpressCandidate extends Express::RouteHandler,
|
private class PromotedExpressCandidate extends Express::RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler instanceof ConnectExpressShared::RouteHandlerCandidate {
|
Http::Servers::StandardRouteHandler instanceof ConnectExpressShared::RouteHandlerCandidate
|
||||||
|
{
|
||||||
override DataFlow::ParameterNode getRouteHandlerParameter(string kind) {
|
override DataFlow::ParameterNode getRouteHandlerParameter(string kind) {
|
||||||
result = ConnectExpressShared::getRouteHandlerParameter(this, kind)
|
result = ConnectExpressShared::getRouteHandlerParameter(this, kind)
|
||||||
}
|
}
|
||||||
@@ -33,7 +35,8 @@ private class PromotedExpressCandidate extends Express::RouteHandler,
|
|||||||
* Add `ConnectExpressShared::RouteHandlerCandidate` to the extent of `Connect::RouteHandler`.
|
* Add `ConnectExpressShared::RouteHandlerCandidate` to the extent of `Connect::RouteHandler`.
|
||||||
*/
|
*/
|
||||||
private class PromotedConnectCandidate extends Connect::RouteHandler,
|
private class PromotedConnectCandidate extends Connect::RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler instanceof ConnectExpressShared::RouteHandlerCandidate {
|
Http::Servers::StandardRouteHandler instanceof ConnectExpressShared::RouteHandlerCandidate
|
||||||
|
{
|
||||||
override DataFlow::ParameterNode getRouteHandlerParameter(string kind) {
|
override DataFlow::ParameterNode getRouteHandlerParameter(string kind) {
|
||||||
result = ConnectExpressShared::getRouteHandlerParameter(this, kind)
|
result = ConnectExpressShared::getRouteHandlerParameter(this, kind)
|
||||||
}
|
}
|
||||||
@@ -43,7 +46,8 @@ private class PromotedConnectCandidate extends Connect::RouteHandler,
|
|||||||
* Add `Restify::RouteHandlerCandidate` to the extent of `Restify::RouteHandler`.
|
* Add `Restify::RouteHandlerCandidate` to the extent of `Restify::RouteHandler`.
|
||||||
*/
|
*/
|
||||||
private class PromotedRestifyCandidate extends Restify::RouteHandler,
|
private class PromotedRestifyCandidate extends Restify::RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler {
|
Http::Servers::StandardRouteHandler
|
||||||
|
{
|
||||||
PromotedRestifyCandidate() { this instanceof Restify::RouteHandlerCandidate }
|
PromotedRestifyCandidate() { this instanceof Restify::RouteHandlerCandidate }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,6 +55,7 @@ private class PromotedRestifyCandidate extends Restify::RouteHandler,
|
|||||||
* Add `Spife::RouteHandlerCandidate` to the extent of `Spife::RouteHandler`.
|
* Add `Spife::RouteHandlerCandidate` to the extent of `Spife::RouteHandler`.
|
||||||
*/
|
*/
|
||||||
private class PromotedSpifeCandidate extends Spife::RouteHandler,
|
private class PromotedSpifeCandidate extends Spife::RouteHandler,
|
||||||
Http::Servers::StandardRouteHandler {
|
Http::Servers::StandardRouteHandler
|
||||||
|
{
|
||||||
PromotedSpifeCandidate() { this instanceof Spife::RouteHandlerCandidate }
|
PromotedSpifeCandidate() { this instanceof Spife::RouteHandlerCandidate }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ private import HeuristicSinks as Sinks
|
|||||||
class HeuristicSink = Sinks::HeuristicSink;
|
class HeuristicSink = Sinks::HeuristicSink;
|
||||||
|
|
||||||
private class HeuristicCodeInjectionSink extends Sinks::HeuristicCodeInjectionSink,
|
private class HeuristicCodeInjectionSink extends Sinks::HeuristicCodeInjectionSink,
|
||||||
CodeInjection::Sink { }
|
CodeInjection::Sink
|
||||||
|
{ }
|
||||||
|
|
||||||
private class HeuristicCommandInjectionSink extends HeuristicSink, CommandInjection::Sink {
|
private class HeuristicCommandInjectionSink extends HeuristicSink, CommandInjection::Sink {
|
||||||
HeuristicCommandInjectionSink() {
|
HeuristicCommandInjectionSink() {
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ private class RemoteFlowPassword extends HeuristicSource, RemoteFlowSource {
|
|||||||
* since it does not properly escape single quotes and dollar symbols.
|
* since it does not properly escape single quotes and dollar symbols.
|
||||||
*/
|
*/
|
||||||
private class JsonStringifyAsCommandInjectionSource extends HeuristicSource,
|
private class JsonStringifyAsCommandInjectionSource extends HeuristicSource,
|
||||||
CommandInjection::Source instanceof JsonStringifyCall {
|
CommandInjection::Source instanceof JsonStringifyCall
|
||||||
|
{
|
||||||
override string getSourceType() { result = "a string from JSON.stringify" }
|
override string getSourceType() { result = "a string from JSON.stringify" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,8 @@ module HtmlSanitization {
|
|||||||
/**
|
/**
|
||||||
* An incomplete sanitizer for HTML-relevant characters.
|
* An incomplete sanitizer for HTML-relevant characters.
|
||||||
*/
|
*/
|
||||||
class IncompleteSanitizer extends IncompleteBlacklistSanitizer instanceof StringReplaceCallSequence {
|
class IncompleteSanitizer extends IncompleteBlacklistSanitizer instanceof StringReplaceCallSequence
|
||||||
|
{
|
||||||
string unsanitized;
|
string unsanitized;
|
||||||
|
|
||||||
IncompleteSanitizer() {
|
IncompleteSanitizer() {
|
||||||
|
|||||||
@@ -282,8 +282,8 @@ module DomBasedXss {
|
|||||||
|
|
||||||
private class UriEncodingSanitizer extends Sanitizer, Shared::UriEncodingSanitizer { }
|
private class UriEncodingSanitizer extends Sanitizer, Shared::UriEncodingSanitizer { }
|
||||||
|
|
||||||
private class SerializeJavascriptSanitizer extends Sanitizer, Shared::SerializeJavascriptSanitizer {
|
private class SerializeJavascriptSanitizer extends Sanitizer, Shared::SerializeJavascriptSanitizer
|
||||||
}
|
{ }
|
||||||
|
|
||||||
private class IsEscapedInSwitchSanitizer extends Sanitizer, Shared::IsEscapedInSwitchSanitizer { }
|
private class IsEscapedInSwitchSanitizer extends Sanitizer, Shared::IsEscapedInSwitchSanitizer { }
|
||||||
|
|
||||||
@@ -335,7 +335,8 @@ module DomBasedXss {
|
|||||||
/**
|
/**
|
||||||
* A sanitizer that blocks the `PrefixString` label when the start of the string is being tested as being of a particular prefix.
|
* A sanitizer that blocks the `PrefixString` label when the start of the string is being tested as being of a particular prefix.
|
||||||
*/
|
*/
|
||||||
abstract class PrefixStringSanitizer extends TaintTracking::LabeledSanitizerGuardNode instanceof StringOps::StartsWith {
|
abstract class PrefixStringSanitizer extends TaintTracking::LabeledSanitizerGuardNode instanceof StringOps::StartsWith
|
||||||
|
{
|
||||||
override predicate sanitizes(boolean outcome, Expr e, DataFlow::FlowLabel label) {
|
override predicate sanitizes(boolean outcome, Expr e, DataFlow::FlowLabel label) {
|
||||||
e = super.getBaseString().asExpr() and
|
e = super.getBaseString().asExpr() and
|
||||||
label = prefixLabel() and
|
label = prefixLabel() and
|
||||||
|
|||||||
@@ -126,7 +126,8 @@ class Configuration extends TaintTracking::Configuration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class PrefixStringSanitizerActivated extends TaintTracking::SanitizerGuardNode,
|
private class PrefixStringSanitizerActivated extends TaintTracking::SanitizerGuardNode,
|
||||||
PrefixStringSanitizer {
|
PrefixStringSanitizer
|
||||||
|
{
|
||||||
PrefixStringSanitizerActivated() { this = this }
|
PrefixStringSanitizerActivated() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,6 +139,7 @@ private class QuoteGuard extends TaintTracking::SanitizerGuardNode, Shared::Quot
|
|||||||
QuoteGuard() { this = this }
|
QuoteGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard {
|
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard
|
||||||
|
{
|
||||||
ContainsHtmlGuard() { this = this }
|
ContainsHtmlGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,8 @@ module IncompleteHtmlAttributeSanitization {
|
|||||||
* vulnerabilities.
|
* vulnerabilities.
|
||||||
*/
|
*/
|
||||||
class HtmlAttributeConcatenationAsSink extends Sink, DataFlow::ValueNode,
|
class HtmlAttributeConcatenationAsSink extends Sink, DataFlow::ValueNode,
|
||||||
HtmlAttributeConcatenation {
|
HtmlAttributeConcatenation
|
||||||
|
{
|
||||||
override string getADangerousCharacter() {
|
override string getADangerousCharacter() {
|
||||||
this.isInterpretedAsJavaScript() and result = "&"
|
this.isInterpretedAsJavaScript() and result = "&"
|
||||||
or
|
or
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ module IndirectCommandInjection {
|
|||||||
/**
|
/**
|
||||||
* A source of user input from the command-line, considered as a flow source for command injection.
|
* A source of user input from the command-line, considered as a flow source for command injection.
|
||||||
*/
|
*/
|
||||||
private class CommandLineArgumentsArrayAsSource extends Source instanceof CommandLineArgumentsArray {
|
private class CommandLineArgumentsArrayAsSource extends Source instanceof CommandLineArgumentsArray
|
||||||
}
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An array of command-line arguments.
|
* An array of command-line arguments.
|
||||||
|
|||||||
@@ -190,7 +190,8 @@ module LoopBoundInjection {
|
|||||||
* A sanitizer that blocks taint flow if the array is checked to be an array using an `X instanceof Array` check.
|
* A sanitizer that blocks taint flow if the array is checked to be an array using an `X instanceof Array` check.
|
||||||
*/
|
*/
|
||||||
class InstanceofArraySanitizerGuard extends TaintTracking::LabeledSanitizerGuardNode,
|
class InstanceofArraySanitizerGuard extends TaintTracking::LabeledSanitizerGuardNode,
|
||||||
DataFlow::ValueNode {
|
DataFlow::ValueNode
|
||||||
|
{
|
||||||
override BinaryExpr astNode;
|
override BinaryExpr astNode;
|
||||||
|
|
||||||
InstanceofArraySanitizerGuard() {
|
InstanceofArraySanitizerGuard() {
|
||||||
@@ -211,7 +212,8 @@ module LoopBoundInjection {
|
|||||||
* Also implicitly makes sure that only the first DoS-prone loop is selected by the query (as the .length test has outcome=false when exiting the loop).
|
* Also implicitly makes sure that only the first DoS-prone loop is selected by the query (as the .length test has outcome=false when exiting the loop).
|
||||||
*/
|
*/
|
||||||
class LengthCheckSanitizerGuard extends TaintTracking::LabeledSanitizerGuardNode,
|
class LengthCheckSanitizerGuard extends TaintTracking::LabeledSanitizerGuardNode,
|
||||||
DataFlow::ValueNode {
|
DataFlow::ValueNode
|
||||||
|
{
|
||||||
override RelationalComparison astNode;
|
override RelationalComparison astNode;
|
||||||
DataFlow::PropRead propRead;
|
DataFlow::PropRead propRead;
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,8 @@ class FileSystemAccessAsExpensiveAction extends ExpensiveAction instanceof FileS
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** A system command execution, considered as an expensive action. */
|
/** A system command execution, considered as an expensive action. */
|
||||||
class SystemCommandExecutionAsExpensiveAction extends ExpensiveAction instanceof SystemCommandExecution {
|
class SystemCommandExecutionAsExpensiveAction extends ExpensiveAction instanceof SystemCommandExecution
|
||||||
|
{
|
||||||
override string describe() { result = "a system command" }
|
override string describe() { result = "a system command" }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,8 +201,8 @@ class RateLimiterFlexibleRateLimiter extends DataFlow::FunctionNode {
|
|||||||
/**
|
/**
|
||||||
* A route-handler expression that is rate-limited by the `rate-limiter-flexible` package.
|
* A route-handler expression that is rate-limited by the `rate-limiter-flexible` package.
|
||||||
*/
|
*/
|
||||||
class RouteHandlerLimitedByRateLimiterFlexible extends RateLimitingMiddleware instanceof RateLimiterFlexibleRateLimiter {
|
class RouteHandlerLimitedByRateLimiterFlexible extends RateLimitingMiddleware instanceof RateLimiterFlexibleRateLimiter
|
||||||
}
|
{ }
|
||||||
|
|
||||||
private class FastifyRateLimiter extends RateLimitingMiddleware {
|
private class FastifyRateLimiter extends RateLimitingMiddleware {
|
||||||
FastifyRateLimiter() { this = DataFlow::moduleImport("fastify-rate-limit") }
|
FastifyRateLimiter() { this = DataFlow::moduleImport("fastify-rate-limit") }
|
||||||
|
|||||||
@@ -168,7 +168,8 @@ private predicate isPropertyPresentOnObjectPrototype(string prop) {
|
|||||||
|
|
||||||
/** A check of form `e.prop` where `prop` is not present on `Object.prototype`. */
|
/** A check of form `e.prop` where `prop` is not present on `Object.prototype`. */
|
||||||
private class PropertyPresenceCheck extends TaintTracking::LabeledSanitizerGuardNode,
|
private class PropertyPresenceCheck extends TaintTracking::LabeledSanitizerGuardNode,
|
||||||
DataFlow::ValueNode {
|
DataFlow::ValueNode
|
||||||
|
{
|
||||||
override PropAccess astNode;
|
override PropAccess astNode;
|
||||||
|
|
||||||
PropertyPresenceCheck() {
|
PropertyPresenceCheck() {
|
||||||
|
|||||||
@@ -143,8 +143,8 @@ module ReflectedXss {
|
|||||||
|
|
||||||
private class UriEncodingSanitizer extends Sanitizer, Shared::UriEncodingSanitizer { }
|
private class UriEncodingSanitizer extends Sanitizer, Shared::UriEncodingSanitizer { }
|
||||||
|
|
||||||
private class SerializeJavascriptSanitizer extends Sanitizer, Shared::SerializeJavascriptSanitizer {
|
private class SerializeJavascriptSanitizer extends Sanitizer, Shared::SerializeJavascriptSanitizer
|
||||||
}
|
{ }
|
||||||
|
|
||||||
private class IsEscapedInSwitchSanitizer extends Sanitizer, Shared::IsEscapedInSwitchSanitizer { }
|
private class IsEscapedInSwitchSanitizer extends Sanitizer, Shared::IsEscapedInSwitchSanitizer { }
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ private class QuoteGuard extends TaintTracking::SanitizerGuardNode, Shared::Quot
|
|||||||
QuoteGuard() { this = this }
|
QuoteGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard {
|
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard
|
||||||
|
{
|
||||||
ContainsHtmlGuard() { this = this }
|
ContainsHtmlGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -190,7 +190,8 @@ module SecondOrderCommandInjection {
|
|||||||
/**
|
/**
|
||||||
* A sanitizer that blocks flow when a string is tested to start with a certain prefix.
|
* A sanitizer that blocks flow when a string is tested to start with a certain prefix.
|
||||||
*/
|
*/
|
||||||
class PrefixStringSanitizer extends TaintTracking::SanitizerGuardNode instanceof StringOps::StartsWith {
|
class PrefixStringSanitizer extends TaintTracking::SanitizerGuardNode instanceof StringOps::StartsWith
|
||||||
|
{
|
||||||
override predicate sanitizes(boolean outcome, Expr e) {
|
override predicate sanitizes(boolean outcome, Expr e) {
|
||||||
e = super.getBaseString().asExpr() and
|
e = super.getBaseString().asExpr() and
|
||||||
outcome = super.getPolarity()
|
outcome = super.getPolarity()
|
||||||
@@ -200,7 +201,8 @@ module SecondOrderCommandInjection {
|
|||||||
/**
|
/**
|
||||||
* A sanitizer that blocks flow when a string does not start with "--"
|
* A sanitizer that blocks flow when a string does not start with "--"
|
||||||
*/
|
*/
|
||||||
class DoubleDashSanitizer extends TaintTracking::SanitizerGuardNode instanceof StringOps::StartsWith {
|
class DoubleDashSanitizer extends TaintTracking::SanitizerGuardNode instanceof StringOps::StartsWith
|
||||||
|
{
|
||||||
DoubleDashSanitizer() { super.getSubstring().mayHaveStringValue("--") }
|
DoubleDashSanitizer() { super.getSubstring().mayHaveStringValue("--") }
|
||||||
|
|
||||||
override predicate sanitizes(boolean outcome, Expr e) {
|
override predicate sanitizes(boolean outcome, Expr e) {
|
||||||
|
|||||||
@@ -59,7 +59,8 @@ module SqlInjection {
|
|||||||
* For simplicity it's used as a sanitizer for all of `js/sql-injection`.
|
* For simplicity it's used as a sanitizer for all of `js/sql-injection`.
|
||||||
*/
|
*/
|
||||||
class LdapStringSanitizer extends Sanitizer,
|
class LdapStringSanitizer extends Sanitizer,
|
||||||
IncompleteBlacklistSanitizer::StringReplaceCallSequence {
|
IncompleteBlacklistSanitizer::StringReplaceCallSequence
|
||||||
|
{
|
||||||
LdapStringSanitizer() {
|
LdapStringSanitizer() {
|
||||||
forall(string char | char = ["*", "(", ")", "\\", "/"] |
|
forall(string char | char = ["*", "(", ")", "\\", "/"] |
|
||||||
this.getAMember().getAReplacedString() = char
|
this.getAMember().getAReplacedString() = char
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ module StoredXss {
|
|||||||
class FileNameSourceAsSource extends Source instanceof FileNameSource { }
|
class FileNameSourceAsSource extends Source instanceof FileNameSource { }
|
||||||
|
|
||||||
/** An instance of user-controlled torrent information, considered as a flow source for stored XSS. */
|
/** An instance of user-controlled torrent information, considered as a flow source for stored XSS. */
|
||||||
class UserControlledTorrentInfoAsSource extends Source instanceof ParseTorrent::UserControlledTorrentInfo {
|
class UserControlledTorrentInfoAsSource extends Source instanceof ParseTorrent::UserControlledTorrentInfo
|
||||||
}
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A regexp replacement involving an HTML meta-character, viewed as a sanitizer for
|
* A regexp replacement involving an HTML meta-character, viewed as a sanitizer for
|
||||||
@@ -44,8 +44,8 @@ module StoredXss {
|
|||||||
|
|
||||||
private class UriEncodingSanitizer extends Sanitizer, Shared::UriEncodingSanitizer { }
|
private class UriEncodingSanitizer extends Sanitizer, Shared::UriEncodingSanitizer { }
|
||||||
|
|
||||||
private class SerializeJavascriptSanitizer extends Sanitizer, Shared::SerializeJavascriptSanitizer {
|
private class SerializeJavascriptSanitizer extends Sanitizer, Shared::SerializeJavascriptSanitizer
|
||||||
}
|
{ }
|
||||||
|
|
||||||
private class IsEscapedInSwitchSanitizer extends Sanitizer, Shared::IsEscapedInSwitchSanitizer { }
|
private class IsEscapedInSwitchSanitizer extends Sanitizer, Shared::IsEscapedInSwitchSanitizer { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ private class QuoteGuard extends TaintTracking::SanitizerGuardNode, Shared::Quot
|
|||||||
QuoteGuard() { this = this }
|
QuoteGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard {
|
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard
|
||||||
|
{
|
||||||
ContainsHtmlGuard() { this = this }
|
ContainsHtmlGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ private class QuoteGuard extends TaintTracking::SanitizerGuardNode, Shared::Quot
|
|||||||
QuoteGuard() { this = this }
|
QuoteGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard {
|
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard
|
||||||
|
{
|
||||||
ContainsHtmlGuard() { this = this }
|
ContainsHtmlGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ module UnsafeJQueryPlugin {
|
|||||||
* An argument that may act as an HTML fragment rather than a CSS selector, as a sink for remote unsafe jQuery plugins.
|
* An argument that may act as an HTML fragment rather than a CSS selector, as a sink for remote unsafe jQuery plugins.
|
||||||
*/
|
*/
|
||||||
class AmbiguousHtmlOrSelectorArgument extends DataFlow::Node,
|
class AmbiguousHtmlOrSelectorArgument extends DataFlow::Node,
|
||||||
DomBasedXss::JQueryHtmlOrSelectorArgument {
|
DomBasedXss::JQueryHtmlOrSelectorArgument
|
||||||
|
{
|
||||||
AmbiguousHtmlOrSelectorArgument() {
|
AmbiguousHtmlOrSelectorArgument() {
|
||||||
// any fixed prefix makes the call unambiguous
|
// any fixed prefix makes the call unambiguous
|
||||||
not exists(getAPrefix())
|
not exists(getAPrefix())
|
||||||
@@ -175,7 +176,8 @@ module UnsafeJQueryPlugin {
|
|||||||
/**
|
/**
|
||||||
* An argument that may act as an HTML fragment rather than a CSS selector, as a sink for remote unsafe jQuery plugins.
|
* An argument that may act as an HTML fragment rather than a CSS selector, as a sink for remote unsafe jQuery plugins.
|
||||||
*/
|
*/
|
||||||
class AmbiguousHtmlOrSelectorArgumentAsSink extends Sink instanceof AmbiguousHtmlOrSelectorArgument {
|
class AmbiguousHtmlOrSelectorArgumentAsSink extends Sink instanceof AmbiguousHtmlOrSelectorArgument
|
||||||
|
{
|
||||||
AmbiguousHtmlOrSelectorArgumentAsSink() { not isLikelyIntentionalHtmlSink(this) }
|
AmbiguousHtmlOrSelectorArgumentAsSink() { not isLikelyIntentionalHtmlSink(this) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,8 @@ class TypeTestGuard extends TaintTracking::SanitizerGuardNode, DataFlow::ValueNo
|
|||||||
private import semmle.javascript.security.dataflow.Xss::Shared as Shared
|
private import semmle.javascript.security.dataflow.Xss::Shared as Shared
|
||||||
|
|
||||||
private class PrefixStringSanitizer extends TaintTracking::SanitizerGuardNode,
|
private class PrefixStringSanitizer extends TaintTracking::SanitizerGuardNode,
|
||||||
DomBasedXss::PrefixStringSanitizer {
|
DomBasedXss::PrefixStringSanitizer
|
||||||
|
{
|
||||||
PrefixStringSanitizer() { this = this }
|
PrefixStringSanitizer() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +81,7 @@ private class QuoteGuard extends TaintTracking::SanitizerGuardNode, Shared::Quot
|
|||||||
QuoteGuard() { this = this }
|
QuoteGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard {
|
private class ContainsHtmlGuard extends TaintTracking::SanitizerGuardNode, Shared::ContainsHtmlGuard
|
||||||
|
{
|
||||||
ContainsHtmlGuard() { this = this }
|
ContainsHtmlGuard() { this = this }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ private import codeql.regex.MissingRegExpAnchor as MissingRegExpAnchor
|
|||||||
private import semmle.javascript.security.regexp.RegExpTreeView::RegExpTreeView as TreeImpl
|
private import semmle.javascript.security.regexp.RegExpTreeView::RegExpTreeView as TreeImpl
|
||||||
|
|
||||||
private module Impl implements
|
private module Impl implements
|
||||||
MissingRegExpAnchor::MissingRegExpAnchorSig<TreeImpl, HostnameRegexp::Impl> {
|
MissingRegExpAnchor::MissingRegExpAnchorSig<TreeImpl, HostnameRegexp::Impl>
|
||||||
|
{
|
||||||
predicate isUsedAsReplace(RegExpPatternSource pattern) {
|
predicate isUsedAsReplace(RegExpPatternSource pattern) {
|
||||||
// is used for capture or replace
|
// is used for capture or replace
|
||||||
exists(DataFlow::MethodCallNode mcn, string name | name = mcn.getMethodName() |
|
exists(DataFlow::MethodCallNode mcn, string name | name = mcn.getMethodName() |
|
||||||
|
|||||||
Reference in New Issue
Block a user