2020-08-20 19:19:49 +08:00
|
|
|
|
# Sandboxing PFFFT library
|
|
|
|
|
|
2022-02-09 21:19:56 +08:00
|
|
|
|
This library was sandboxed as part of Google's summer 2020 internship program
|
|
|
|
|
([blog post](https://security.googleblog.com/2020/12/improving-open-source-security-during.html)).
|
|
|
|
|
|
2020-09-15 22:46:03 +08:00
|
|
|
|
Build System: CMake
|
2020-08-20 19:19:49 +08:00
|
|
|
|
OS: Linux
|
|
|
|
|
|
2022-02-09 21:19:56 +08:00
|
|
|
|
### How to use from an existing Project
|
|
|
|
|
|
|
|
|
|
If your project does not include Sandboxed API as a dependency yet, add the
|
|
|
|
|
following lines to the main `CMakeLists.txt`:
|
2020-08-26 22:18:31 +08:00
|
|
|
|
|
2022-02-09 21:19:56 +08:00
|
|
|
|
```cmake
|
|
|
|
|
include(FetchContent)
|
|
|
|
|
|
|
|
|
|
FetchContent_Declare(sandboxed-api
|
|
|
|
|
GIT_REPOSITORY https://github.com/google/sandboxed-api
|
|
|
|
|
GIT_TAG main # Or pin a specific commit/tag
|
|
|
|
|
)
|
|
|
|
|
FetchContent_MakeAvailable(sandboxed-api) # CMake 3.14 or higher
|
|
|
|
|
|
|
|
|
|
add_sapi_subdirectory(contrib/pffft)
|
2020-09-03 22:59:54 +08:00
|
|
|
|
```
|
2022-02-09 21:19:56 +08:00
|
|
|
|
|
|
|
|
|
The `add_sapi_subdirectory()` macro sets up the source and binary directories
|
|
|
|
|
for the sandboxed jsonnet targets.
|
|
|
|
|
|
|
|
|
|
Afterwards your project's code can link to `sapi_contrib::pffft` and use the
|
|
|
|
|
generated header `pffft_sapi.sapi.h`. An example sandbox policy can be found
|
|
|
|
|
in `main_pffft_sandboxed.cc`.
|
|
|
|
|
|
2020-09-15 22:46:03 +08:00
|
|
|
|
### For testing:
|
2020-08-20 19:19:49 +08:00
|
|
|
|
`cd build`, then `./pffft_sandboxed`
|
|
|
|
|
|
|
|
|
|
### For debug:
|
2020-08-26 22:18:31 +08:00
|
|
|
|
display custom info with
|
|
|
|
|
`./pffft_sandboxed --logtostderr`
|
2020-08-20 19:19:49 +08:00
|
|
|
|
|
2020-09-15 22:46:03 +08:00
|
|
|
|
## ***About the project***
|
2022-02-09 21:19:56 +08:00
|
|
|
|
|
|
|
|
|
PFFFT library is concerned with 1D Fast-Fourier Transformations finding a
|
2020-08-20 19:19:49 +08:00
|
|
|
|
compromise between accuracy and speed. It deals with real and complex
|
2020-09-15 22:46:03 +08:00
|
|
|
|
vectors, both cases being illustrated in the testing part (`test_pffft.c`
|
|
|
|
|
for initially and original version, `main_pffft_sandboxed.cc` for our
|
2020-08-20 19:19:49 +08:00
|
|
|
|
currently implemented sandboxed version).
|
|
|
|
|
The original files can be found at: https://bitbucket.org/jpommier/pffft/src.*
|
|
|
|
|
|
2022-02-09 21:19:56 +08:00
|
|
|
|
The purpose of sandboxing is to limit the permissions and capabilities of
|
2020-09-15 22:46:03 +08:00
|
|
|
|
library’s methods, in order to secure the usage of them.
|
|
|
|
|
After obtaining the sandbox, the functions will be called through an
|
|
|
|
|
Sandbox API (being called `api` in the current test) and so, the
|
|
|
|
|
operations, system calls or namspaces access may be controlled.
|
|
|
|
|
From both `pffft.h` and `fftpack.h` headers, useful methods are added to
|
|
|
|
|
sapi library builded with CMake. There is also a need to link math library
|
|
|
|
|
as the transformations made require mathematical operators.
|
|
|
|
|
Regarding the testing of the methods, one main is doing this job by
|
|
|
|
|
iterating through a set of values, that represents the accuracy of
|
|
|
|
|
transformations and print the speed for each value and type of
|
|
|
|
|
transformation. More specifically, the input length is the target for
|
|
|
|
|
accuracy (named as `n`) and it stands for the number of data points from
|
|
|
|
|
the series that calculate the result of transformation. It is also
|
|
|
|
|
important to mention that the `complex` variable stands for a boolean value
|
|
|
|
|
that tells the type of transformation (0 for REAL and 1 for COMPLEX) and
|
2020-08-20 19:19:49 +08:00
|
|
|
|
it is taken into account while testing.
|
2020-08-28 00:46:59 +08:00
|
|
|
|
In the end, the performance of PFFFT library it is outlined by the output.
|
2020-09-15 22:46:03 +08:00
|
|
|
|
There are two output formats available, from which you can choose through
|
2020-08-28 00:49:09 +08:00
|
|
|
|
`--output_format=` command-line flag.
|
2020-08-28 00:46:59 +08:00
|
|
|
|
Without using this type of argument when running, the output format is set
|
|
|
|
|
by default.*
|
2020-08-20 19:19:49 +08:00
|
|
|
|
|
|
|
|
|
#### CMake observations resume:
|
2022-02-09 21:19:56 +08:00
|
|
|
|
|
2020-08-26 22:18:31 +08:00
|
|
|
|
* linking pffft and fftpack (which contains necessary functions for pffft)
|
2020-09-15 22:46:03 +08:00
|
|
|
|
* set math library
|
2020-08-20 19:19:49 +08:00
|
|
|
|
|
|
|
|
|
#### Sandboxed main observations resume:
|
2022-02-09 21:19:56 +08:00
|
|
|
|
|
2020-08-26 22:18:31 +08:00
|
|
|
|
* containing two testing parts (fft / pffft benchmarks)
|
2020-09-15 22:46:03 +08:00
|
|
|
|
* showing the performance of the transformations implies
|
|
|
|
|
testing them through various FFT dimenstions.
|
|
|
|
|
Variable n, the input length, will take specific values
|
|
|
|
|
meaning the number of points to which it is set the calculus
|
|
|
|
|
(more details of mathematical purpose of n - https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm).
|
2020-08-26 22:18:31 +08:00
|
|
|
|
* output shows speed depending on the input length
|
2020-08-28 00:46:59 +08:00
|
|
|
|
* use `--output_format=0` or `--output_format=1` arguments to choose between output formats.
|
2020-09-15 22:46:03 +08:00
|
|
|
|
`0` is for a detailed output, while `1` is only displaying each transformation process speed.
|
2020-08-20 19:19:49 +08:00
|
|
|
|
|
|
|
|
|
### Bugs history
|
2020-09-15 22:46:03 +08:00
|
|
|
|
1. [Solved] pffft benchmark bug: "Sandbox not active"
|
|
|
|
|
|
|
|
|
|
n = 64, status OK, `pffft_transform` generates error
|
|
|
|
|
n > 64, status not OK
|
2021-09-29 20:38:41 +08:00
|
|
|
|
Problem on initialising `absl::StatusOr<PFFFT_Setup *> s;` the memory that stays
|
2020-09-15 22:46:03 +08:00
|
|
|
|
for s is not the same with the address passed in `pffft_transform` function.
|
|
|
|
|
(`sapi::v::GenericPtr` - to be changed)
|
2020-08-20 19:19:49 +08:00
|
|
|
|
|
2020-09-15 22:46:03 +08:00
|
|
|
|
Temporary solution: change the generated files to accept
|
|
|
|
|
`uintptr_t` instead of `PFFFT_Setup`
|
2020-08-20 19:19:49 +08:00
|
|
|
|
|
2020-09-15 22:46:03 +08:00
|
|
|
|
Solution: using `sapi::v::RemotePtr` instead of `sapi::v::GenericPtr`
|
|
|
|
|
to access the memory of object `s`
|
2020-08-20 20:37:34 +08:00
|
|
|
|
|
2020-08-27 20:54:57 +08:00
|
|
|
|
2. [Unresolved] compiling bug: "No space left on device"
|
2020-08-20 21:15:02 +08:00
|
|
|
|
|
2020-09-15 22:46:03 +08:00
|
|
|
|
The building process creates some `embed` files that use lots of
|
|
|
|
|
memory, trying to write them on `/tmp`.
|
|
|
|
|
|
|
|
|
|
Temporary solution: clean /tmp directory by `sudo rm -rf /tmp/*`
|