aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Moore <paul@paul-moore.com>2017-11-28 18:51:12 -0500
committerPaul Moore <paul@paul-moore.com>2017-11-28 18:51:12 -0500
commitef28df55ac27e1e5cd122e19fa311d886d47a756 (patch)
tree61410c34607ca1bdf625b74467f1811f947f5690
parent4f0753e708c2e07f6e9bc1adfa73138e8ab0ee5d (diff)
selinux: ensure the context is NUL terminated in security_context_to_sid_core()
The syzbot/syzkaller automated tests found a problem in security_context_to_sid_core() during early boot (before we load the SELinux policy) where we could potentially feed context strings without NUL terminators into the strcmp() function. We already guard against this during normal operation (after the SELinux policy has been loaded) by making a copy of the context strings and explicitly adding a NUL terminator to the end. The patch extends this protection to the early boot case (no loaded policy) by moving the context copy earlier in security_context_to_sid_core(). Reported-by: syzbot <syzkaller@googlegroups.com> Signed-off-by: Paul Moore <paul@paul-moore.com> Reviewed-By: William Roberts <william.c.roberts@intel.com>
-rw-r--r--security/selinux/ss/services.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index 33cfe5d3d6cb..d05496deb229 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -1413,27 +1413,25 @@ static int security_context_to_sid_core(const char *scontext, u32 scontext_len,
1413 if (!scontext_len) 1413 if (!scontext_len)
1414 return -EINVAL; 1414 return -EINVAL;
1415 1415
1416 /* Copy the string to allow changes and ensure a NUL terminator */
1417 scontext2 = kmemdup_nul(scontext, scontext_len, gfp_flags);
1418 if (!scontext2)
1419 return -ENOMEM;
1420
1416 if (!ss_initialized) { 1421 if (!ss_initialized) {
1417 int i; 1422 int i;
1418 1423
1419 for (i = 1; i < SECINITSID_NUM; i++) { 1424 for (i = 1; i < SECINITSID_NUM; i++) {
1420 if (!strcmp(initial_sid_to_string[i], scontext)) { 1425 if (!strcmp(initial_sid_to_string[i], scontext2)) {
1421 *sid = i; 1426 *sid = i;
1422 return 0; 1427 goto out;
1423 } 1428 }
1424 } 1429 }
1425 *sid = SECINITSID_KERNEL; 1430 *sid = SECINITSID_KERNEL;
1426 return 0; 1431 goto out;
1427 } 1432 }
1428 *sid = SECSID_NULL; 1433 *sid = SECSID_NULL;
1429 1434
1430 /* Copy the string so that we can modify the copy as we parse it. */
1431 scontext2 = kmalloc(scontext_len + 1, gfp_flags);
1432 if (!scontext2)
1433 return -ENOMEM;
1434 memcpy(scontext2, scontext, scontext_len);
1435 scontext2[scontext_len] = 0;
1436
1437 if (force) { 1435 if (force) {
1438 /* Save another copy for storing in uninterpreted form */ 1436 /* Save another copy for storing in uninterpreted form */
1439 rc = -ENOMEM; 1437 rc = -ENOMEM;