2015-01-22 06:37:43 +00:00
|
|
|
/*
|
2016-02-11 19:48:58 +00:00
|
|
|
* Copyright (c) 2014-present, Facebook, Inc.
|
2015-01-22 06:37:43 +00:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the BSD-style license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <osquery/core.h>
|
|
|
|
#include <osquery/filesystem.h>
|
|
|
|
#include <osquery/logger.h>
|
|
|
|
#include <osquery/tables.h>
|
|
|
|
|
2016-02-12 17:39:20 +00:00
|
|
|
#include "osquery/core/conversions.h"
|
|
|
|
|
2015-01-22 06:37:43 +00:00
|
|
|
namespace osquery {
|
|
|
|
namespace tables {
|
|
|
|
|
2016-02-12 17:39:20 +00:00
|
|
|
static const std::string kKernelArgumentsPath = "/proc/cmdline";
|
|
|
|
static const std::string kKernelSignaturePath = "/proc/version";
|
2015-01-22 06:37:43 +00:00
|
|
|
|
|
|
|
QueryData genKernelInfo(QueryContext& context) {
|
|
|
|
QueryData results;
|
|
|
|
Row r;
|
|
|
|
|
|
|
|
if (pathExists(kKernelArgumentsPath).ok()) {
|
|
|
|
std::string arguments_line;
|
|
|
|
// Grab the whole arguments string from proc.
|
|
|
|
if (readFile(kKernelArgumentsPath, arguments_line).ok()) {
|
|
|
|
auto arguments = split(arguments_line, " ");
|
|
|
|
std::string additional_arguments;
|
|
|
|
|
|
|
|
// Iterate over each space-tokenized argument.
|
|
|
|
for (const auto& argument : arguments) {
|
|
|
|
if (argument.substr(0, 11) == "BOOT_IMAGE=") {
|
|
|
|
r["path"] = argument.substr(11);
|
|
|
|
} else if (argument.substr(0, 5) == "root=") {
|
|
|
|
r["device"] = argument.substr(5);
|
|
|
|
} else {
|
|
|
|
if (additional_arguments.size() > 0) {
|
|
|
|
additional_arguments += " ";
|
|
|
|
}
|
|
|
|
additional_arguments += argument;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
r["arguments"] = additional_arguments;
|
|
|
|
}
|
|
|
|
} else {
|
2016-02-12 17:39:20 +00:00
|
|
|
TLOG << "Cannot find kernel arguments file: " << kKernelArgumentsPath;
|
2015-01-22 06:37:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (pathExists(kKernelSignaturePath).ok()) {
|
|
|
|
std::string signature;
|
|
|
|
|
|
|
|
// The signature includes the kernel version, build data, buildhost,
|
|
|
|
// GCC version used, and possibly build date.
|
|
|
|
if (readFile(kKernelSignaturePath, signature).ok()) {
|
|
|
|
auto details = split(signature, " ");
|
|
|
|
if (details.size() > 2 && details[1] == "version") {
|
|
|
|
r["version"] = details[2];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2016-02-12 17:39:20 +00:00
|
|
|
TLOG << "Cannot find kernel signature file: " << kKernelSignaturePath;
|
2015-01-22 06:37:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
results.push_back(r);
|
|
|
|
return results;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|