[PATCH] macintosh:fix oob read in do_adb_query function

Subsystems: linux for power macintosh, the rest

DORMANTno replies

2 messages, 2 authors, 2022-07-13 · open the first message on its own page

[PATCH] macintosh:fix oob read in do_adb_query function

From: NAME <hidden>
Date: 2022-07-13 14:12:08

From: sohu0106 <redacted>

In do_adb_query function of drivers/macintosh/adb.c,
req->data is copy form userland. The parameter
"req->data[2]" is Missing check, the array size of
adb_handler[] is 16, so "adb_handler[req->data[2]].
original_address" and "adb_handler[req->data[2]].
handler_id" will lead to oob read.

Signed-off-by: sohu0106 <redacted>
---
 drivers/macintosh/adb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c
index 439fab4eaa85..1bbb9ca08d40 100644
--- a/drivers/macintosh/adb.c
+++ b/drivers/macintosh/adb.c
@@ -647,7 +647,7 @@ do_adb_query(struct adb_request *req)
 
 	switch(req->data[1]) {
 	case ADB_QUERY_GETDEVINFO:
-		if (req->nbytes < 3)
+		if (req->nbytes < 3 || req->data[2] >= 16)
 			break;
 		mutex_lock(&adb_handler_mutex);
 		req->reply[0] = adb_handler[req->data[2]].original_address;
-- 
2.25.1

Re: [PATCH] macintosh:fix oob read in do_adb_query function

From: Greg KH <hidden>
Date: 2022-07-13 14:11:34

On Wed, Jul 13, 2022 at 09:40:37PM +0800, NAME wrote:
From: sohu0106 <redacted>
For obvious reasons, we need a real name here, and in the signed-off-by
line.
In do_adb_query function of drivers/macintosh/adb.c,
req->data is copy form userland. The parameter
"req->data[2]" is Missing check, the array size of
adb_handler[] is 16, so "adb_handler[req->data[2]].
original_address" and "adb_handler[req->data[2]].
handler_id" will lead to oob read.
You can use all 72 columns, if you want to re-wrap these lines when you
resend.
quoted hunk
Signed-off-by: sohu0106 <redacted>
---
 drivers/macintosh/adb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c
index 439fab4eaa85..1bbb9ca08d40 100644
--- a/drivers/macintosh/adb.c
+++ b/drivers/macintosh/adb.c
@@ -647,7 +647,7 @@ do_adb_query(struct adb_request *req)
 
 	switch(req->data[1]) {
 	case ADB_QUERY_GETDEVINFO:
-		if (req->nbytes < 3)
+		if (req->nbytes < 3 || req->data[2] >= 16)
Shouldn't 16 be the array size instead of having this hard coded to a
magic number?

Something like "sizeof(adb_handler) / sizeof(struct adb_handler)"?

Maybe not, that's messy, your choice.

thanks,

greg k-h
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help