android: Fix information disclosure vulnerability
Gagan Grover [Tue, 15 Nov 2016 07:18:31 +0000 (12:18 +0530)]
The format specifier %p can leak kernel addresses while not valuing the
kptr_restrict system settings.
The fix is designed to use %pK instead of %p, which also evaluates whether
kptr_restrict is set.

CVE-2016-6683 A-30143283
CVE-2016-6684 A-30148243

Bug 1812688

Change-Id: If2b1d25948af5c21333a189fe25e5412c6c2c27f
Signed-off-by: Gagan Grover <ggrover@nvidia.com>
Reviewed-on: http://git-master/r/1253303
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>

drivers/android/binder.c
drivers/staging/android/sync.c

index fde05d6..55a2dfa 100644 (file)
@@ -3366,7 +3366,7 @@ static void print_binder_node(struct seq_file *m, struct binder_node *node)
 
 static void print_binder_ref(struct seq_file *m, struct binder_ref *ref)
 {
-       seq_printf(m, "  ref %d: desc %d %snode %d s %d w %d d %p\n",
+       seq_printf(m, "  ref %d: desc %d %snode %d s %d w %d d %pK\n",
                   ref->debug_id, ref->desc, ref->node->proc ? "" : "dead ",
                   ref->node->debug_id, ref->strong, ref->weak, ref->death);
 }
index 5a8db2c..cac58ac 100644 (file)
@@ -625,7 +625,7 @@ int sync_fence_wait(struct sync_fence *fence, long timeout)
                return err;
 
        if (fence->status < 0) {
-               pr_info("fence error %d on [%p]\n", fence->status, fence);
+               pr_info("fence error %d on [%pK]\n", fence->status, fence);
                sync_fence_dump(fence);
                sync_dump();
                return fence->status;
@@ -633,7 +633,7 @@ int sync_fence_wait(struct sync_fence *fence, long timeout)
 
        if (fence->status == 0) {
                if (timeout > 0) {
-                       pr_info("fence timeout on [%p] after %dms\n", fence,
+                       pr_info("fence timeout on [%pK] after %dms\n", fence,
                                jiffies_to_msecs(timeout));
                        sync_fence_dump(fence);
                        sync_dump();
@@ -972,7 +972,7 @@ static void sync_print_fence(struct seq_file *s, struct sync_fence *fence)
        struct list_head *pos;
        unsigned long flags;
 
-       seq_printf(s, "[%p] %s: %s\n", fence, fence->name,
+       seq_printf(s, "[%pK] %s: %s\n", fence, fence->name,
                   sync_status_str(fence->status));
 
        list_for_each(pos, &fence->pt_list_head) {