asterinas icon indicating copy to clipboard operation
asterinas copied to clipboard

Capacity overflow in `sys_getdents()`

Open Marsman1996 opened this issue 1 year ago • 1 comments

Describe the bug

There is a capacity overflow in sys_getdents() at kernel/src/syscall/getdents64.rs:36 when call sys_getdents with large buf_len.

https://github.com/asterinas/asterinas/blob/f01772ca853e76d3076a561da3281034e3a46196/kernel/src/syscall/getdents64.rs#L36

To Reproduce

  1. Compile a program which calls sys_getdents:
#define _GNU_SOURCE
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
  int fd = open("/proc", O_RDONLY);
  char *buffer = (char *)0x4;
  size_t count = 0xffffffffffffffff;

  long result = syscall(SYS_getdents, fd, buffer, count);

  perror("getdents");

  return 0;
}
  1. Run the compiled program in Asterinas.

Expected behavior

Asterinas reports capacity overflow and is terminated.

Environment

  • Official docker asterinas/asterinas:0.8.1
  • 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
  • Asterinas version: main 8bfbdf6

Logs

~ # /root/getdents.c
panicked at /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/raw_vec.rs:25:5:
capacity overflow
Printing stack trace:
   1: fn 0xffffffff887e5490 - pc 0xffffffff887e54fa / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a9296c0;

   2: fn 0xffffffff887e52a0 - pc 0xffffffff887e53f0 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929720;

   3: fn 0xffffffff88049000 - pc 0xffffffff8804900a / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929870;

   4: fn 0xffffffff889c2af0 - pc 0xffffffff889c2b72 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929880;

   5: fn 0xffffffff88987fe0 - pc 0xffffffff88988009 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929910;

   6: fn 0xffffffff88989710 - pc 0xffffffff8898974e / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929950;

   7: fn 0xffffffff8874d1b0 - pc 0xffffffff8874d20f / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929990;

   8: fn 0xffffffff88742380 - pc 0xffffffff887423b4 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a9299f0;

   9: fn 0xffffffff88749e10 - pc 0xffffffff88749e2f / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929a90;

  10: fn 0xffffffff885af2a0 - pc 0xffffffff885af899 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929ab0;

  11: fn 0xffffffff884ac9d0 - pc 0xffffffff884c30aa / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a929f30;

  12: fn 0xffffffff884ac1b0 - pc 0xffffffff884ac23e / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a9403d0;

  13: fn 0xffffffff884a15f0 - pc 0xffffffff884a216f / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a940570;

  14: fn 0xffffffff883a06f0 - pc 0xffffffff883a06fe / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a940f90;

  15: fn 0xffffffff88857ed0 - pc 0xffffffff88857ee6 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a940fb0;

  16: fn 0xffffffff88832c80 - pc 0xffffffff88832ce9 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a940fd0;


     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883b687; rbp                0x0; rsp 0xffff80000a941000;

[OSDK] The kernel seems panicked. Parsing stack trace for source lines:
(  1) /root/asterinas/ostd/src/panicking.rs:113
(  2) /root/asterinas/ostd/src/panicking.rs:59
(  3) 73ctk84we8vz1kw7hv2sr00er:?
(  4) ??:?
(  5) alloc.4436a8b0cd505e33-cgu.0:?
(  6) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/raw_vec.rs:594
(  7) ??:?
(  8) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/spec_from_elem.rs:52
(  9) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/mod.rs:2737
( 10) /root/asterinas/kernel/src/syscall/getdents64.rs:36
( 11) /root/asterinas/kernel/src/syscall/mod.rs:171
( 12) /root/asterinas/kernel/src/syscall/mod.rs:328
( 13) /root/asterinas/kernel/src/thread/task.rs:69
( 14) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:79
( 15) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/boxed.rs:2077
( 16) /root/asterinas/ostd/src/task/mod.rs:175

Marsman1996 avatar Sep 12 '24 02:09 Marsman1996

And a similar bug in sys_getdents64(), which could be triggered by

#define _GNU_SOURCE
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
  int fd = open("/proc", O_RDONLY);
  char *buffer = (char *)0x4;
  size_t count = 0xffffffffffffffff;

  long result = syscall(SYS_getdents64, fd, buffer, count);

  perror("getdents");

  return 0;
}

And the crash log is:

~ # ./getdents64.c
panicked at /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/raw_vec.rs:25:5:
capacity overflow
Printing stack trace:
   1: fn 0xffffffff887e5b50 - pc 0xffffffff887e5bba / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa296c0;

   2: fn 0xffffffff887e5960 - pc 0xffffffff887e5ab0 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29720;

   3: fn 0xffffffff88049000 - pc 0xffffffff8804900a / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29870;

   4: fn 0xffffffff889c31b0 - pc 0xffffffff889c3232 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29880;

   5: fn 0xffffffff889886a0 - pc 0xffffffff889886c9 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29910;

   6: fn 0xffffffff88989dd0 - pc 0xffffffff88989e0e / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29950;

   7: fn 0xffffffff8874d870 - pc 0xffffffff8874d8cf / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29990;

   8: fn 0xffffffff88742a40 - pc 0xffffffff88742a74 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa299f0;

   9: fn 0xffffffff8874a4d0 - pc 0xffffffff8874a4ef / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29a90;

  10: fn 0xffffffff885b0360 - pc 0xffffffff885b0959 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29ab0;

  11: fn 0xffffffff884ad090 - pc 0xffffffff884d68e8 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa29f30;

  12: fn 0xffffffff884ac870 - pc 0xffffffff884ac8fe / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa403d0;

  13: fn 0xffffffff884a1cb0 - pc 0xffffffff884a282f / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa40570;

  14: fn 0xffffffff883a06f0 - pc 0xffffffff883a06fe / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa40f90;

  15: fn 0xffffffff88858590 - pc 0xffffffff888585a6 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa40fb0;

  16: fn 0xffffffff88833340 - pc 0xffffffff888333a9 / registers:

     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa40fd0;


     rax                0x1; rdx                0x8; rcx                0x0; rbx                0x0;
     rsi                0x1; rdi 0xffffffff8883bd47; rbp                0x0; rsp 0xffff80000aa41000;

[OSDK] The kernel seems panicked. Parsing stack trace for source lines:
(  1) /root/asterinas/ostd/src/panicking.rs:113
(  2) /root/asterinas/ostd/src/panicking.rs:59
(  3) 73ctk84we8vz1kw7hv2sr00er:?
(  4) ??:?
(  5) alloc.4436a8b0cd505e33-cgu.0:?
(  6) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/raw_vec.rs:594
(  7) ??:?
(  8) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/spec_from_elem.rs:52
(  9) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/mod.rs:2737
( 10) /root/asterinas/kernel/src/syscall/getdents64.rs:66
( 11) /root/asterinas/kernel/src/syscall/mod.rs:171
( 12) /root/asterinas/kernel/src/syscall/mod.rs:328
( 13) /root/asterinas/kernel/src/thread/task.rs:69
( 14) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:79
( 15) /root/.rustup/toolchains/nightly-2024-06-20-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/boxed.rs:2077
( 16) /root/asterinas/ostd/src/task/mod.rs:175
make: *** [Makefile:172: run] Error 1

Marsman1996 avatar Sep 12 '24 02:09 Marsman1996