mirror of
https://github.com/google/sandboxed-api.git
synced 2024-03-22 13:11:30 +08:00
Dump coverage prior to execveat
PiperOrigin-RevId: 520002416 Change-Id: Ic792b0b71b8e7b2f00b669db9b6831acd8341c5c
This commit is contained in:
parent
1755ba08e1
commit
a4d602298b
|
@ -244,6 +244,7 @@ cc_binary(
|
||||||
":comms",
|
":comms",
|
||||||
":forkserver",
|
":forkserver",
|
||||||
":sanitizer",
|
":sanitizer",
|
||||||
|
":util",
|
||||||
"//sandboxed_api/util:raw_logging",
|
"//sandboxed_api/util:raw_logging",
|
||||||
"//sandboxed_api/util:strerror",
|
"//sandboxed_api/util:strerror",
|
||||||
"@com_google_absl//absl/log:globals",
|
"@com_google_absl//absl/log:globals",
|
||||||
|
@ -266,6 +267,7 @@ cc_library(
|
||||||
":fork_client",
|
":fork_client",
|
||||||
":forkserver_bin_embed",
|
":forkserver_bin_embed",
|
||||||
":forkserver_cc_proto",
|
":forkserver_cc_proto",
|
||||||
|
":util",
|
||||||
"//sandboxed_api:config",
|
"//sandboxed_api:config",
|
||||||
"//sandboxed_api:embed_file",
|
"//sandboxed_api:embed_file",
|
||||||
"//sandboxed_api/util:fileops",
|
"//sandboxed_api/util:fileops",
|
||||||
|
|
|
@ -210,6 +210,7 @@ target_link_libraries(sandbox2_forkserver_bin PRIVATE
|
||||||
sandbox2::comms
|
sandbox2::comms
|
||||||
sandbox2::forkserver
|
sandbox2::forkserver
|
||||||
sandbox2::sanitizer
|
sandbox2::sanitizer
|
||||||
|
sandbox2::util
|
||||||
sapi::base
|
sapi::base
|
||||||
sapi::raw_logging
|
sapi::raw_logging
|
||||||
)
|
)
|
||||||
|
@ -236,6 +237,7 @@ target_link_libraries(sandbox2_global_forkserver
|
||||||
absl::log
|
absl::log
|
||||||
sandbox2::client
|
sandbox2::client
|
||||||
sandbox2::forkserver_bin_embed
|
sandbox2::forkserver_bin_embed
|
||||||
|
sandbox2::util
|
||||||
sapi::strerror
|
sapi::strerror
|
||||||
sapi::base
|
sapi::base
|
||||||
sapi::config
|
sapi::config
|
||||||
|
|
|
@ -61,6 +61,10 @@
|
||||||
#include "sandboxed_api/util/raw_logging.h"
|
#include "sandboxed_api/util/raw_logging.h"
|
||||||
#include "sandboxed_api/util/strerror.h"
|
#include "sandboxed_api/util/strerror.h"
|
||||||
|
|
||||||
|
namespace sandbox2 {
|
||||||
|
|
||||||
|
namespace file_util = ::sapi::file_util;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using ::sapi::StrError;
|
using ::sapi::StrError;
|
||||||
|
@ -244,10 +248,6 @@ bool IsLikelyChrooted() {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace sandbox2 {
|
|
||||||
|
|
||||||
namespace file_util = ::sapi::file_util;
|
|
||||||
|
|
||||||
void ForkServer::PrepareExecveArgs(const ForkRequest& request,
|
void ForkServer::PrepareExecveArgs(const ForkRequest& request,
|
||||||
std::vector<std::string>* args,
|
std::vector<std::string>* args,
|
||||||
std::vector<std::string>* envp) {
|
std::vector<std::string>* envp) {
|
||||||
|
@ -616,11 +616,8 @@ void ForkServer::ExecuteProcess(int execve_fd, const char* const* argv,
|
||||||
// Do not add any code before execve(), as it's subject to seccomp policies.
|
// Do not add any code before execve(), as it's subject to seccomp policies.
|
||||||
// Indicate that it's a special execve(), by setting 4th, 5th and 6th syscall
|
// Indicate that it's a special execve(), by setting 4th, 5th and 6th syscall
|
||||||
// argument to magic values.
|
// argument to magic values.
|
||||||
util::Syscall(
|
util::Execveat(execve_fd, "", argv, envp, AT_EMPTY_PATH,
|
||||||
__NR_execveat, static_cast<uintptr_t>(execve_fd),
|
internal::kExecveMagic);
|
||||||
reinterpret_cast<uintptr_t>(""), reinterpret_cast<uintptr_t>(argv),
|
|
||||||
reinterpret_cast<uintptr_t>(envp), static_cast<uintptr_t>(AT_EMPTY_PATH),
|
|
||||||
reinterpret_cast<uintptr_t>(internal::kExecveMagic));
|
|
||||||
|
|
||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
SAPI_RAW_PLOG(ERROR, "sandbox2::ForkServer: execveat failed");
|
SAPI_RAW_PLOG(ERROR, "sandbox2::ForkServer: execveat failed");
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
#include "sandboxed_api/sandbox2/comms.h"
|
#include "sandboxed_api/sandbox2/comms.h"
|
||||||
#include "sandboxed_api/sandbox2/fork_client.h"
|
#include "sandboxed_api/sandbox2/fork_client.h"
|
||||||
#include "sandboxed_api/sandbox2/forkserver_bin_embed.h"
|
#include "sandboxed_api/sandbox2/forkserver_bin_embed.h"
|
||||||
|
#include "sandboxed_api/sandbox2/util.h"
|
||||||
#include "sandboxed_api/util/fileops.h"
|
#include "sandboxed_api/util/fileops.h"
|
||||||
#include "sandboxed_api/util/raw_logging.h"
|
#include "sandboxed_api/util/raw_logging.h"
|
||||||
|
|
||||||
|
@ -142,11 +143,8 @@ int LaunchForkserver(void* vargs) {
|
||||||
|
|
||||||
char proc_name[] = "S2-FORK-SERV";
|
char proc_name[] = "S2-FORK-SERV";
|
||||||
char* const argv[] = {proc_name, nullptr};
|
char* const argv[] = {proc_name, nullptr};
|
||||||
char* const envp[] = {nullptr};
|
util::Execveat(args->exec_fd, "", argv, environ, AT_EMPTY_PATH);
|
||||||
|
|
||||||
syscall(__NR_execveat, args->exec_fd, "", argv, envp, AT_EMPTY_PATH);
|
|
||||||
SAPI_RAW_PLOG(FATAL, "Could not launch forkserver binary");
|
SAPI_RAW_PLOG(FATAL, "Could not launch forkserver binary");
|
||||||
abort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
absl::StatusOr<std::unique_ptr<GlobalForkClient>> StartGlobalForkServer() {
|
absl::StatusOr<std::unique_ptr<GlobalForkClient>> StartGlobalForkServer() {
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "absl/algorithm/container.h"
|
#include "absl/algorithm/container.h"
|
||||||
#include "absl/base/attributes.h"
|
#include "absl/base/attributes.h"
|
||||||
|
@ -68,6 +69,32 @@ std::string ConcatenateAll(char* const* arr) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __ELF__
|
||||||
|
extern "C" void __gcov_dump() ABSL_ATTRIBUTE_WEAK;
|
||||||
|
extern "C" void __gcov_flush() ABSL_ATTRIBUTE_WEAK;
|
||||||
|
extern "C" void __gcov_reset() ABSL_ATTRIBUTE_WEAK;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void DumpCoverageData() {
|
||||||
|
#ifdef __ELF__
|
||||||
|
if (&__gcov_dump != nullptr) {
|
||||||
|
SAPI_RAW_LOG(WARNING, "Flushing coverage data (dump)");
|
||||||
|
__gcov_dump();
|
||||||
|
} else if (&__gcov_flush != nullptr) {
|
||||||
|
SAPI_RAW_LOG(WARNING, "Flushing coverage data (flush)");
|
||||||
|
__gcov_flush();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResetCoverageData() {
|
||||||
|
#ifdef __ELF__
|
||||||
|
if (&__gcov_reset != nullptr) {
|
||||||
|
__gcov_reset();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void CharPtrArrToVecString(char* const* arr, std::vector<std::string>* vec) {
|
void CharPtrArrToVecString(char* const* arr, std::vector<std::string>* vec) {
|
||||||
|
@ -400,4 +427,22 @@ absl::StatusOr<std::string> ReadCPathFromPid(pid_t pid, uintptr_t ptr) {
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Execveat(int dirfd, const char* pathname, const char* const argv[],
|
||||||
|
const char* const envp[], int flags, uintptr_t extra_arg) {
|
||||||
|
// Flush coverage data prior to exec.
|
||||||
|
if (extra_arg == 0) {
|
||||||
|
DumpCoverageData();
|
||||||
|
}
|
||||||
|
int res = syscall(__NR_execveat, static_cast<uintptr_t>(dirfd),
|
||||||
|
reinterpret_cast<uintptr_t>(pathname),
|
||||||
|
reinterpret_cast<uintptr_t>(argv),
|
||||||
|
reinterpret_cast<uintptr_t>(envp),
|
||||||
|
static_cast<uintptr_t>(flags), extra_arg);
|
||||||
|
// Reset coverage data if exec fails as the counters have been already dumped.
|
||||||
|
if (extra_arg == 0) {
|
||||||
|
ResetCoverageData();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace sandbox2::util
|
} // namespace sandbox2::util
|
||||||
|
|
|
@ -106,6 +106,10 @@ std::string GetPtraceEventName(int event);
|
||||||
// process memory
|
// process memory
|
||||||
absl::StatusOr<std::string> ReadCPathFromPid(pid_t pid, uintptr_t ptr);
|
absl::StatusOr<std::string> ReadCPathFromPid(pid_t pid, uintptr_t ptr);
|
||||||
|
|
||||||
|
// Wrapper for execveat(2).
|
||||||
|
int Execveat(int dirfd, const char* pathname, const char* const argv[],
|
||||||
|
const char* const envp[], int flags, uintptr_t extra_arg = 0);
|
||||||
|
|
||||||
} // namespace sandbox2::util
|
} // namespace sandbox2::util
|
||||||
|
|
||||||
#endif // SANDBOXED_API_SANDBOX2_UTIL_H_
|
#endif // SANDBOXED_API_SANDBOX2_UTIL_H_
|
||||||
|
|
Loading…
Reference in New Issue
Block a user