From e577674c9db5433f44195fe8dd29e48a365a0ae4 Mon Sep 17 00:00:00 2001 From: huaqingsimeng <1004904143@qq.com> Date: Thu, 24 Aug 2023 19:28:24 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AD=90=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=9C=BA=E6=99=AF=E4=B8=8B=E5=A4=87=E4=BB=BD=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E6=B5=8B=E8=AF=95=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huaqingsimeng --- services/backup.para | 5 ++++- services/backup_sa/src/module_ipc/service.cpp | 9 +++++++++ utils/include/b_ohos/startup/backup_para.h | 10 ++++++++++ utils/include/b_resources/b_constants.h | 6 +++++- utils/src/b_ohos/startup/backup_para.cpp | 18 ++++++++++++++++++ 5 files changed, 46 insertions(+), 2 deletions(-) diff --git a/services/backup.para b/services/backup.para index 73c5f0455..8f4a7ef77 100644 --- a/services/backup.para +++ b/services/backup.para @@ -11,4 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -backup.debug.overrideExtensionConfig=false \ No newline at end of file +backup.debug.overrideExtensionConfig=false + +backup.debug.overrideAccountConfig=false +backup.debug.overrideAccountNumber=0 \ No newline at end of file diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 6fa4f7f2b..9b77fdf77 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -42,6 +42,7 @@ #include "b_file_info.h" #include "b_json/b_json_cached_entity.h" #include "b_json/b_json_entity_caps.h" +#include "b_ohos/startup/backup_para.h" #include "b_process/b_multiuser.h" #include "b_resources/b_constants.h" #include "bundle_mgr_client.h" @@ -57,9 +58,17 @@ using namespace std; REGISTER_SYSTEM_ABILITY_BY_ID(Service, FILEMANAGEMENT_BACKUP_SERVICE_SA_ID, false); +namespace { +constexpr int32_t DEBUG_ID = 100; +} // namespace + /* Shell/Xts user id equal to 0/1, we need set default 100 */ static inline int32_t GetUserIdDefault() { + auto [isDebug, debugId] = BackupPara().GetBackupDebugOverrideAccount(); + if (isDebug && debugId > DEBUG_ID) { + return debugId; + } auto multiuser = BMultiuser::ParseUid(IPCSkeleton::GetCallingUid()); if ((multiuser.userId == BConstants::SYSTEM_UID) || (multiuser.userId == BConstants::XTS_UID)) { return BConstants::DEFAULT_USER_ID; diff --git a/utils/include/b_ohos/startup/backup_para.h b/utils/include/b_ohos/startup/backup_para.h index 74d4e848a..1f6cad364 100644 --- a/utils/include/b_ohos/startup/backup_para.h +++ b/utils/include/b_ohos/startup/backup_para.h @@ -16,6 +16,8 @@ #ifndef OHOS_FILEMGMT_BACKUP_BACKUP_PARA_H #define OHOS_FILEMGMT_BACKUP_BACKUP_PARA_H +#include + namespace OHOS::FileManagement::Backup { class BackupPara { public: @@ -25,6 +27,14 @@ public: * @return 获取的配置项backup.debug.overrideExtensionConfig值为true时则返回true,否则返回false */ bool GetBackupDebugOverrideExtensionConfig(); + + /** + * @brief 获取backup.para配置项backup.debug.overrideAccountConfig + * + * @return bool值为配置项backup.debug.overrideAccountConfig值 + * @return int32_t值为配置项backup.debug.overrideAccountNumber值 + */ + std::tuple GetBackupDebugOverrideAccount(); }; } // namespace OHOS::FileManagement::Backup diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index 0287ca83c..329bf50fb 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -104,9 +104,13 @@ static inline std::string ENTRY_NAME_LINKPATH = "linkpath"; static inline std::string ENTRY_NAME_PATH = "path"; static inline std::string ENTRY_NAME_SIZE = "size"; -// backup.para内配置项的名称,改配置项值为true时可在不更新hap包的情况下,可以读取包管理元数据配置文件的内容 +// backup.para内配置项的名称,该配置项值为true时可在不更新hap包的情况下,可以读取包管理元数据配置文件的内容 static inline std::string BACKUP_DEBUG_OVERRIDE_EXTENSION_CONFIG_KEY = "backup.debug.overrideExtensionConfig"; +// backup.para内配置项的名称,该配置项AccountConfig为true时存在时,可以按照配置的AccountNumber备份恢复 +static inline std::string BACKUP_DEBUG_OVERRIDE_ACCOUNT_CONFIG_KEY = "backup.debug.overrideAccountConfig"; +static inline std::string BACKUP_DEBUG_OVERRIDE_ACCOUNT_NUMBER_KEY = "backup.debug.overrideAccountNumber"; + // 应用备份数据暂存路径 static inline std::string_view SA_BUNDLE_BACKUP_BACKUP = "/backup/"; static inline std::string_view SA_BUNDLE_BACKUP_RESTORE = "/restore/"; diff --git a/utils/src/b_ohos/startup/backup_para.cpp b/utils/src/b_ohos/startup/backup_para.cpp index 2c7abcb5f..8047ef0e1 100644 --- a/utils/src/b_ohos/startup/backup_para.cpp +++ b/utils/src/b_ohos/startup/backup_para.cpp @@ -65,4 +65,22 @@ bool BackupPara::GetBackupDebugOverrideExtensionConfig() } return value == "true"; } + +tuple BackupPara::GetBackupDebugOverrideAccount() +{ + auto [getCfgParaValSucc, value] = GetConfigParameterValue(BConstants::BACKUP_DEBUG_OVERRIDE_ACCOUNT_CONFIG_KEY, + BConstants::BACKUP_PARA_VALUE_MAX); + if (!getCfgParaValSucc) { + return {false, 0}; + } + if (value == "true") { + auto [getCfgParaValSucc, value] = GetConfigParameterValue(BConstants::BACKUP_DEBUG_OVERRIDE_ACCOUNT_NUMBER_KEY, + BConstants::BACKUP_PARA_VALUE_MAX); + if (!getCfgParaValSucc) { + return {false, 0}; + } + return {true, stoi(value)}; + } + return {false, 0}; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file -- Gitee From fdaa6423919ecdc1d3ecf060b6ea15138b3e22cf Mon Sep 17 00:00:00 2001 From: huaqingsimeng Date: Fri, 25 Aug 2023 10:11:07 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=A6=81=E6=AD=A2tar=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E8=A1=8C=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huaqingsimeng --- services/backup.para | 5 +---- services/backup_sa/src/module_ipc/service.cpp | 9 -------- utils/include/b_error/b_excep_utils.h | 7 +++++++ utils/include/b_ohos/startup/backup_para.h | 10 --------- utils/include/b_resources/b_constants.h | 6 +----- utils/src/b_error/b_excep_utils.cpp | 21 +++++++++++++++++++ utils/src/b_ohos/startup/backup_para.cpp | 18 ---------------- utils/src/b_tarball/b_tarball_cmdline.cpp | 3 +++ 8 files changed, 33 insertions(+), 46 deletions(-) diff --git a/services/backup.para b/services/backup.para index 8f4a7ef77..73c5f0455 100644 --- a/services/backup.para +++ b/services/backup.para @@ -11,7 +11,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -backup.debug.overrideExtensionConfig=false - -backup.debug.overrideAccountConfig=false -backup.debug.overrideAccountNumber=0 \ No newline at end of file +backup.debug.overrideExtensionConfig=false \ No newline at end of file diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index 9b77fdf77..6fa4f7f2b 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -42,7 +42,6 @@ #include "b_file_info.h" #include "b_json/b_json_cached_entity.h" #include "b_json/b_json_entity_caps.h" -#include "b_ohos/startup/backup_para.h" #include "b_process/b_multiuser.h" #include "b_resources/b_constants.h" #include "bundle_mgr_client.h" @@ -58,17 +57,9 @@ using namespace std; REGISTER_SYSTEM_ABILITY_BY_ID(Service, FILEMANAGEMENT_BACKUP_SERVICE_SA_ID, false); -namespace { -constexpr int32_t DEBUG_ID = 100; -} // namespace - /* Shell/Xts user id equal to 0/1, we need set default 100 */ static inline int32_t GetUserIdDefault() { - auto [isDebug, debugId] = BackupPara().GetBackupDebugOverrideAccount(); - if (isDebug && debugId > DEBUG_ID) { - return debugId; - } auto multiuser = BMultiuser::ParseUid(IPCSkeleton::GetCallingUid()); if ((multiuser.userId == BConstants::SYSTEM_UID) || (multiuser.userId == BConstants::XTS_UID)) { return BConstants::DEFAULT_USER_ID; diff --git a/utils/include/b_error/b_excep_utils.h b/utils/include/b_error/b_excep_utils.h index ac0192165..518cb9ff1 100644 --- a/utils/include/b_error/b_excep_utils.h +++ b/utils/include/b_error/b_excep_utils.h @@ -80,6 +80,13 @@ public: * @return std::string 返回绝对路径 */ static std::string Canonicalize(const std::string_view &path); + + /** + * @brief 校验命令参数禁止命令注入 + * + * @param argv 命令参数 + */ + static void VerifyArgv(const std::vector &argv); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_B_EXCEP_UTILES_H \ No newline at end of file diff --git a/utils/include/b_ohos/startup/backup_para.h b/utils/include/b_ohos/startup/backup_para.h index 1f6cad364..74d4e848a 100644 --- a/utils/include/b_ohos/startup/backup_para.h +++ b/utils/include/b_ohos/startup/backup_para.h @@ -16,8 +16,6 @@ #ifndef OHOS_FILEMGMT_BACKUP_BACKUP_PARA_H #define OHOS_FILEMGMT_BACKUP_BACKUP_PARA_H -#include - namespace OHOS::FileManagement::Backup { class BackupPara { public: @@ -27,14 +25,6 @@ public: * @return 获取的配置项backup.debug.overrideExtensionConfig值为true时则返回true,否则返回false */ bool GetBackupDebugOverrideExtensionConfig(); - - /** - * @brief 获取backup.para配置项backup.debug.overrideAccountConfig - * - * @return bool值为配置项backup.debug.overrideAccountConfig值 - * @return int32_t值为配置项backup.debug.overrideAccountNumber值 - */ - std::tuple GetBackupDebugOverrideAccount(); }; } // namespace OHOS::FileManagement::Backup diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index 329bf50fb..0287ca83c 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -104,13 +104,9 @@ static inline std::string ENTRY_NAME_LINKPATH = "linkpath"; static inline std::string ENTRY_NAME_PATH = "path"; static inline std::string ENTRY_NAME_SIZE = "size"; -// backup.para内配置项的名称,该配置项值为true时可在不更新hap包的情况下,可以读取包管理元数据配置文件的内容 +// backup.para内配置项的名称,改配置项值为true时可在不更新hap包的情况下,可以读取包管理元数据配置文件的内容 static inline std::string BACKUP_DEBUG_OVERRIDE_EXTENSION_CONFIG_KEY = "backup.debug.overrideExtensionConfig"; -// backup.para内配置项的名称,该配置项AccountConfig为true时存在时,可以按照配置的AccountNumber备份恢复 -static inline std::string BACKUP_DEBUG_OVERRIDE_ACCOUNT_CONFIG_KEY = "backup.debug.overrideAccountConfig"; -static inline std::string BACKUP_DEBUG_OVERRIDE_ACCOUNT_NUMBER_KEY = "backup.debug.overrideAccountNumber"; - // 应用备份数据暂存路径 static inline std::string_view SA_BUNDLE_BACKUP_BACKUP = "/backup/"; static inline std::string_view SA_BUNDLE_BACKUP_RESTORE = "/restore/"; diff --git a/utils/src/b_error/b_excep_utils.cpp b/utils/src/b_error/b_excep_utils.cpp index 032f51b34..bd006cadf 100644 --- a/utils/src/b_error/b_excep_utils.cpp +++ b/utils/src/b_error/b_excep_utils.cpp @@ -15,6 +15,7 @@ #include "b_error/b_excep_utils.h" +#include #include #include "b_resources/b_constants.h" @@ -24,6 +25,12 @@ namespace OHOS::FileManagement::Backup { using namespace std; +namespace { +const vector COMMAND_INJECTION = { + "--to-command", "--xform", "-op", "--checkpoint", "--checkpoint-action", +}; +} // namespace + void BExcepUltils::VerifyPath(const string_view &path, bool isExtension) { try { @@ -48,4 +55,18 @@ string BExcepUltils::Canonicalize(const string_view &path) throw BError(BError::Codes::EXT_INVAL_ARG, "Invalid path"); } } + +void BExcepUltils::VerifyArgv(const vector &argv) +{ + for (auto &arg : argv) { + if (arg == nullptr) { + return; + } + if (std::any_of(COMMAND_INJECTION.begin(), COMMAND_INJECTION.end(), + [&arg](const string_view &cmd) { return arg == cmd; })) { + HILOGE("Invalid argv: %{public}s", arg.data()); + throw BError(BError::Codes::EXT_INVAL_ARG, "Invalid argv"); + } + } +} } // namespace OHOS::FileManagement::Backup diff --git a/utils/src/b_ohos/startup/backup_para.cpp b/utils/src/b_ohos/startup/backup_para.cpp index 8047ef0e1..2c7abcb5f 100644 --- a/utils/src/b_ohos/startup/backup_para.cpp +++ b/utils/src/b_ohos/startup/backup_para.cpp @@ -65,22 +65,4 @@ bool BackupPara::GetBackupDebugOverrideExtensionConfig() } return value == "true"; } - -tuple BackupPara::GetBackupDebugOverrideAccount() -{ - auto [getCfgParaValSucc, value] = GetConfigParameterValue(BConstants::BACKUP_DEBUG_OVERRIDE_ACCOUNT_CONFIG_KEY, - BConstants::BACKUP_PARA_VALUE_MAX); - if (!getCfgParaValSucc) { - return {false, 0}; - } - if (value == "true") { - auto [getCfgParaValSucc, value] = GetConfigParameterValue(BConstants::BACKUP_DEBUG_OVERRIDE_ACCOUNT_NUMBER_KEY, - BConstants::BACKUP_PARA_VALUE_MAX); - if (!getCfgParaValSucc) { - return {false, 0}; - } - return {true, stoi(value)}; - } - return {false, 0}; -} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/utils/src/b_tarball/b_tarball_cmdline.cpp b/utils/src/b_tarball/b_tarball_cmdline.cpp index a5e3da653..bdae2fb95 100644 --- a/utils/src/b_tarball/b_tarball_cmdline.cpp +++ b/utils/src/b_tarball/b_tarball_cmdline.cpp @@ -20,6 +20,7 @@ #include #include "b_error/b_error.h" +#include "b_error/b_excep_utils.h" #include "b_filesystem/b_dir.h" #include "b_process/b_guard_cwd.h" #include "b_process/b_process.h" @@ -69,6 +70,8 @@ void BTarballCmdline::Tar(string_view root, vector includes, vector argv.push_back(exclude); } + BExcepUltils::VerifyArgv(argv); + // 如果打包后生成了打包文件,则默认打包器打包时生成的错误可以忽略(比如打包一个不存在的文件) auto [bFatalError, errCode] = BProcess::ExecuteCmd(argv, IsTarFatalErrorOccur); if (bFatalError || (errCode && access(tarballPath_.data(), F_OK) != 0)) { -- Gitee