Libseccomp: RFE: рдЕрдзрд┐рд╕реВрдЪрдирд╛ API рдХреЗ рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC рд╕рдорд░реНрдерди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдирд╡ре░ 2020  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: seccomp/libseccomp

seccomp_notify_receive() рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╕ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

        if (ioctl(fd, SECCOMP_IOCTL_NOTIF_RECV, req) < 0)
                return -ECANCELED;

errno рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ -ECANCELED рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╕реНрдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рд┐рдЧрд░реНрдЧ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдХрд╛рд░рдг ioctl рдиреЗ EINTR рд▓реМрдЯрд╛ рджрд┐рдпрд╛:

1448850 ioctl(7, SECCOMP_IOCTL_NOTIF_RECV <unfinished ...>
1448230 getpid()                        = 1448217
1448230 tgkill(1448217, 1448850, SIGURG) = 0
1448850 <... ioctl resumed>, 0x7fc65d49ecd0) = -1 EINTR (Interrupted system call)

рд╕рд┐рдЧреНрдирд▓ SIGURL рдЧреЛрд▓рдВрдЧ рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, https://go-review.googlesource.com/c/go/+/232862/ рдореЗрдВ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВред
рдЙрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, EINTR рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп syscall рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ libseccomp рдХреЛ рдЗрд╕рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ seccomp_notify_receive() рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдФрд░ seccomp_notify_respond() рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП syscall рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдкреИрдЯрд░реНрди рд╕рдорд╛рди рд╣реИ:

        if (ioctl(fd, SECCOMP_IOCTL_NOTIF_SEND, resp) < 0)
                return -ECANCELED;

рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдореБрдЭреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ errno = ENOENT рдорд┐рд▓рддрд╛ рд╣реИ:

1497880 ioctl(12, SECCOMP_IOCTL_NOTIF_SEND, 0x7f718fd28e10) = -1 ENOENT (No such file or directory)

libseccomp рдореБрдЭреЗ ENOENT рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ ( SECCOMP_IOCTL_NOTIF_SEND рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╛рдзрд┐рдд рд╣реЛ рдЧрдИ рд╣реИ) рдФрд░ EINTR (seccomp рдПрдЬреЗрдВрдЯ рдХреЛ SIGURG рд╕рд┐рдЧреНрдирд▓ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореИрдВ рдЧреЛрд▓рд╛рдВрдЧ рд╕реЗ errno рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

enhancement prioritmedium

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд▓реЗрдХрд┐рди рдирдП рдлрд╝рдВрдХреНрд╢рди ... _rc_filter() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рди рдХрд┐ _rc_filter_sys() ...

рдЖрд╣ ... рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рддрд╛ рд╣реИ, "system.c" рдореЗрдВ рджреЗрдЦреЗрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ libseccomp рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдХреЙрд▓ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдирдкреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП seccomp_load(3) рджреЗрдЦреЗрдВ)ред

рдореИрдВ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ RFE рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

@drakenclimber рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ v2.6.x (рд╕рдВрднрд╡рддрдГ v2.5.2) рд╕рд╛рдордЧреНрд░реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ v2.5.1 рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЕрдЧрд░ рдЖрдкрдХреА рд╕реЛрдЪ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдп @ рдЕрд▓реНрдмрд╛рдиред

SCMP_FLTATR_API_SYSRAWRC рдХреЛ seccomp_attr_set(3) рдореИрдирдкреЗрдЬ рдореЗрдВ рджреЗрдЦреЗрдВ:

рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реНрд▓реИрдЧ рдХрд┐ рдХреНрдпрд╛ libseccomp рдХреЛ рд╕рд┐рд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ -ECANCELED рдХреЗ рдмрдЬрд╛рдп рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдорд╛рди == 0)ред

рд╣рдо рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдХрд░реНрдиреЗрд▓/libc рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ libseccomp API рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд░рд┐рдЯрд░реНрди рдХреЛрдб рд╡рд╛рджрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -ECANCELED рдХреЛ рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд░реНрдиреЗрд▓/libc рд░рд┐рдЯрд░реНрди рдХреЛрдб рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд╕ рдЪреЗрддрд╛рд╡рдиреА рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдПрдХ рд╕реНрдерд┐рд░ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ NOTABUG рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╢реНрди рд╣реИрдВ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдЗрд╕ рдкрд░ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рд╣рдо рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рд╛рдп @pcmoore , рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╣рдо рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд░реНрдиреЗрд▓/libc рд░рд┐рдЯрд░реНрди рдХреЛрдб рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

рд▓реЗрдХрд┐рди рдирдП рдХрд╛рд░реНрдп

  • seccomp_notify_receive
  • seccomp_notify_response
  • seccomp_notify_id_valid

_rc_filter() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ _rc_filter_sys() рдХрд╛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВред

рд▓реЗрдХрд┐рди рдирдП рдлрд╝рдВрдХреНрд╢рди ... _rc_filter() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рди рдХрд┐ _rc_filter_sys() ...

рдЖрд╣ ... рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рддрд╛ рд╣реИ, "system.c" рдореЗрдВ рджреЗрдЦреЗрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ libseccomp рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдХреЙрд▓ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдирдкреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП SCMP_FLTATR_API_SYSRAWRC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП seccomp_load(3) рджреЗрдЦреЗрдВ)ред

рдореИрдВ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ RFE рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

@drakenclimber рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ v2.6.x (рд╕рдВрднрд╡рддрдГ v2.5.2) рд╕рд╛рдордЧреНрд░реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ v2.5.1 рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЕрдЧрд░ рдЖрдкрдХреА рд╕реЛрдЪ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдзрдиреНрдпрд╡рд╛рдж!

рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдХреЛрдб рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде ENOENT рдФрд░ EINTR рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрд▓рд╛рдВрдЧ рдкрдХреНрд╖ рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд╛рдпрд╛:

-   if retCode := C.seccomp_notify_respond(C.int(fd), resp); retCode != 0 {
-       return errRc(retCode)
+   for {
+       retCode, errno := C.seccomp_notify_respond(C.int(fd), resp)
+       if errno == syscall.EINTR {
+           continue
+       }
+       if errno == syscall.ENOENT {
+           return errno
+       }
+       if retCode != 0 {
+           return errRc(retCode)
+       }
+       break
    }

рдЗрд╕рдХреЗ рд╕рд╛рде, рдпрд╣ libseccomp-2.5.0 рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ,

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

srd424 picture srd424  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

erdumbledore picture erdumbledore  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

drakenclimber picture drakenclimber  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mvo5 picture mvo5  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

drakenclimber picture drakenclimber  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ