Skip to content

Commit

Permalink
Do not allow IDs with null bytes in decoded payloads
Browse files Browse the repository at this point in the history
  • Loading branch information
terminalmage authored and Ch3LL committed Oct 3, 2017
1 parent dd0b338 commit 5f8b5e1
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
3 changes: 3 additions & 0 deletions salt/crypt.py
Expand Up @@ -607,6 +607,9 @@ def sign_in(self, timeout=60, safe=True, tries=1, channel=None):
raise tornado.gen.Return('retry')
else:
raise SaltClientError('Attempt to authenticate with the salt master failed with timeout error')
if not isinstance(payload, dict):
log.error('Sign-in attempt failed: %s', payload)
raise tornado.gen.Return(False)
if 'load' in payload:
if 'ret' in payload['load']:
if not payload['load']['ret']:
Expand Down
11 changes: 11 additions & 0 deletions salt/transport/tcp.py
Expand Up @@ -623,6 +623,17 @@ def handle_message(self, stream, header, payload):
'payload and load must be a dict', header=header))
raise tornado.gen.Return()

try:
id_ = payload['load'].get('id', '')
if '\0' in id_:
log.error('Payload contains an id with a null byte: %s', payload)
stream.send(self.serial.dumps('bad load: id contains a null byte'))
raise tornado.gen.Return()
except TypeError:
log.error('Payload contains non-string id: %s', payload)
stream.send(self.serial.dumps('bad load: id {0} is not a string'.format(id_)))
raise tornado.gen.Return()

# intercept the "_auth" commands, since the main daemon shouldn't know
# anything about our key auth
if payload['enc'] == 'clear' and payload.get('load', {}).get('cmd') == '_auth':
Expand Down
11 changes: 11 additions & 0 deletions salt/transport/zeromq.py
Expand Up @@ -596,6 +596,17 @@ def handle_message(self, stream, payload):
stream.send(self.serial.dumps('payload and load must be a dict'))
raise tornado.gen.Return()

try:
id_ = payload['load'].get('id', '')
if '\0' in id_:
log.error('Payload contains an id with a null byte: %s', payload)
stream.send(self.serial.dumps('bad load: id contains a null byte'))
raise tornado.gen.Return()
except TypeError:
log.error('Payload contains non-string id: %s', payload)
stream.send(self.serial.dumps('bad load: id {0} is not a string'.format(id_)))
raise tornado.gen.Return()

# intercept the "_auth" commands, since the main daemon shouldn't know
# anything about our key auth
if payload['enc'] == 'clear' and payload.get('load', {}).get('cmd') == '_auth':
Expand Down

0 comments on commit 5f8b5e1

Please sign in to comment.