@@ -205,21 +205,42 @@ sandbox, while `openat` doesn't support following symlinks.
205
205
206
206
` cap-std ` has some similar functionality to [ ` pathrs ` ] in that it also
207
207
explicitly verifies that ` /proc ` has actual ` procfs ` mounted on it and nothing
208
- mounted on top, and it can also use ` openat2 ` . However, ` cap-std ` uses
209
- ` RESOLVE_BENEATH ` -style resolution where absolute paths are considered errors,
210
- while ` pathrs ` uses ` RESOLVE_IN_ROOT ` where absolute paths are interpreted as
211
- references to the base file descriptor. And overall, ` cap-std ` seeks to provide
212
- a portable ` std ` -like API which supports Windows in addition to Unix-like
213
- platforms, while ` pathrs ` provides a lower-level API that exposes more of the
214
- underlying ` openat2 ` options and only supports Linux.
208
+ mounted on top, and it can also use ` openat2 ` . And it has some similar
209
+ functionality to [ ` unix_fd ` ] . However, ` cap-std ` uses ` RESOLVE_BENEATH ` -style
210
+ resolution where absolute paths are considered errors, while ` pathrs ` and
211
+ ` unix_fd ` use ` RESOLVE_IN_ROOT ` -style resolution, where absolute paths are
212
+ interpreted as references to the base file descriptor. And overall, ` cap-std `
213
+ seeks to provide a portable ` std ` -like API which supports Windows in addition
214
+ to Unix-like platforms, while ` pathrs ` provides a lower-level API that exposes
215
+ more of the underlying ` openat2 ` options and only supports Linux, and ` unix_fd `
216
+ is specific to Unix-like platforms.
215
217
216
218
[ ` obnth ` ] is a new crate which appears to be very similar to ` cap_std::fs ` .
217
219
It's not mature yet, and it doesn't support Windows. It does support
218
220
` openat2 ` -like features such as ` RESOLVE_NO_XDEV ` , ` RESOLVE_NO_SYMLINKS ` ,
219
221
and ` RESOLVE_IN_ROOT ` , including emulation when ` openat2 ` isn't available.
220
222
223
+ ### Why use ` RESOLVE_BENEATH ` ?
224
+
225
+ Capability-based security is all about * granularity* . We want to encourage
226
+ applications and users to think about having separate handles for directories
227
+ they need, so that they're isolated from each other, rather than in terms of
228
+ having "root directories" containing multiple unrelated resources.
229
+
230
+ Also, some applications have "well known" absolute path strings present, such
231
+ as "/etc/resolv.conf", and could accidentally use them within ` Dir ` methods.
232
+ ` RESOLVE_BENEATH ` catches such errors early, rather than taking chances with
233
+ user content inside the ` Dir ` .
234
+
235
+ And, ` RESOLVE_BENEATH ` handles symlinks within a ` Dir ` consistently. Accessing
236
+ a symlink to an absolute path within a ` Dir ` is always an error. With
237
+ ` RESOLVE_IN_ROOT ` , a symlink to an absolute path in a ` Dir ` may succeed, and
238
+ potentially resolve to something different than it would when resolved through
239
+ the process filesystem namespace.
240
+
221
241
[ `arf-strings` ] : https://github.com/bytecodealliance/arf-strings/
222
242
[ `openat` ] : https://crates.io/crates/openat
223
243
[ `pathrs` ] : https://crates.io/crates/pathrs
224
244
[ `obnth` ] : https://crates.io/crates/obnth
225
245
[ `camino` ] : https://crates.io/crates/camino
246
+ [ `unix_fd` ] : https://crates.io/crates/unix_fd
0 commit comments