you give process direct access to a piece of kernel memory.
its a reason why there is separation. thats all.
Most of the security concerns with io_uring that I've seen aren't related to the shared buffers at all but simply stem from the fact that io_uring is a mechanism to instruct the kernel to do stuff without making system calls, so security measures that focus on what system calls a process is allowed to do are ineffective.
This isn't the issue; it's relatively easy to safely share some ring buffers. The issue was/is that io_uring is rapidly growing the equivalent of ~all historical Linux syscall interfaces and sometimes comparable security measures were missed on the new interfaces. (Also, stuff like seccomp filters on syscalls are kind of meaningless for io_uring.)
...don't you supply the memory in the submission queue? or do you mean the queues themselves?
The memory for the submission queue is mmapd into user space. Easiest implementation to read is the Zig stdlib: