|
81 | 81 |
|
82 | 82 |
|
83 | 83 | WEAK_HASHES = ("md4", "md5", "ripemd160", "sha", "sha1") |
| 84 | +HASHLIB_WEAK_HASHES = ( |
| 85 | + "hashlib.md4", |
| 86 | + "hashlib.md5", |
| 87 | + "hashlib.ripemd160", |
| 88 | + "hashlib.sha", |
| 89 | + "hashlib.sha1", |
| 90 | +) |
84 | 91 |
|
85 | 92 |
|
86 | 93 | class HmacWeakHash(Rule): |
@@ -108,33 +115,37 @@ def analyze(self, context: dict, **kwargs: dict) -> Result: |
108 | 115 | """ |
109 | 116 | hmac.new(key, msg=None, digestmod='') |
110 | 117 | """ |
111 | | - name = call.get_argument(position=2, name="digestmod").value |
| 118 | + argument = call.get_argument(position=2, name="digestmod") |
| 119 | + digestmod = argument.value |
112 | 120 |
|
113 | | - # TODO(ericwb): can hashlib.md5 be passed as digestmod? |
114 | | - |
115 | | - if isinstance(name, str) and name.lower() in WEAK_HASHES: |
| 121 | + if ( |
| 122 | + isinstance(digestmod, str) and digestmod.lower() in WEAK_HASHES |
| 123 | + ) or digestmod in HASHLIB_WEAK_HASHES: |
116 | 124 | return Result( |
117 | 125 | rule_id=self.id, |
118 | 126 | location=Location( |
119 | 127 | file_name=context["file_name"], |
120 | | - node=call.function_node, |
| 128 | + node=argument.node, |
121 | 129 | ), |
122 | 130 | level=Level.ERROR, |
123 | | - message=self.message.format(name), |
| 131 | + message=self.message.format(digestmod), |
124 | 132 | ) |
125 | 133 | elif call.name_qualified in ["hmac.digest"]: |
126 | 134 | """ |
127 | 135 | hmac.digest(key, msg, digest) |
128 | 136 | """ |
129 | | - name = call.get_argument(position=2, name="digest").value |
| 137 | + argument = call.get_argument(position=2, name="digest") |
| 138 | + digest = argument.value |
130 | 139 |
|
131 | | - if isinstance(name, str) and name.lower() in WEAK_HASHES: |
| 140 | + if ( |
| 141 | + isinstance(digest, str) and digest.lower() in WEAK_HASHES |
| 142 | + ) or digest in HASHLIB_WEAK_HASHES: |
132 | 143 | return Result( |
133 | 144 | rule_id=self.id, |
134 | 145 | location=Location( |
135 | 146 | file_name=context["file_name"], |
136 | | - node=call.function_node, |
| 147 | + node=argument.node, |
137 | 148 | ), |
138 | 149 | level=Level.ERROR, |
139 | | - message=self.message.format(name), |
| 150 | + message=self.message.format(digest), |
140 | 151 | ) |
0 commit comments