我用LsaStorePrivateData在计算机A上存储一些数据。 问题是,使用LsaRetrievePrivateData api func从同一本地networking上的任何其他PC可以轻松读取。 我怎样才能防止这个? 停止“远程registry”服务没有帮助。 任何其他技巧,以防止远程访问与LsaStorePrivateData存储的数据?
问候,Artur
没有必要做任何事情,除非:
目标机器上的操作系统严重损坏,在这种情况下,重新安装可能是唯一安全的方法。
您已经使用访客帐户或其他不受信任的用户访问的其他帐户存储了数据,在这种情况下,答案就是不这样做。 🙂
LsaStorePrivateData的文档说:
由LsaStorePrivateData函数存储的数据不受绝对保护。 但是,数据在被存储之前被加密,并且密钥具有DACL,只允许创建者和管理员读取数据。
这个测试代码可能对那些对这个主题感兴趣的人有用,或者想要仔细检查他们的机器在这方面是否安全。 我自己的测试使用这个代码证实了记录的行为。
#include <Windows.h> #include <Ntsecapi.h> #include <stdio.h> wchar_t keyname_string[] = L"harrytest"; LSA_UNICODE_STRING keyname; LSA_OBJECT_ATTRIBUTES lsa_object_attributes; int set(void) { LSA_HANDLE ph; LSA_UNICODE_STRING secretdata; wchar_t secretdata_buffer[2]; DWORD status; status = LsaOpenPolicy(NULL, &lsa_object_attributes, POLICY_ALL_ACCESS, &ph); if (status != 0) { printf("LsaOpenPolicy: %X\n", status); return status; } secretdata.Length = 2; secretdata.MaximumLength = sizeof(secretdata_buffer); secretdata.Buffer = secretdata_buffer; secretdata_buffer[0] = L'x'; secretdata_buffer[1] = L'\0'; status = LsaStorePrivateData(ph, &keyname, &secretdata); if (status != 0) { printf("LsaStorePrivateData: %X\n", status); return status; } printf("Success!\n"); return 0; } int get(wchar_t * target_string) { LSA_HANDLE ph; LSA_UNICODE_STRING * secretdata; LSA_UNICODE_STRING target; DWORD status; if (target_string != NULL) { target.Length = wcslen(target_string) * 2; target.MaximumLength = target.Length + 2; target.Buffer = target_string; } status = LsaOpenPolicy(target_string ? &target : NULL, &lsa_object_attributes, MAXIMUM_ALLOWED, &ph); if (status != 0) { printf("LsaOpenPolicy: %X\n", status); return status; } status = LsaRetrievePrivateData(ph, &keyname, &secretdata); if (status != 0) { printf("LsaRetrievePrivateData: %X\n", status); return status; } if (secretdata == NULL) { printf("NULL pointer retrieved\n"); return 1; } printf("%u bytes retrieved\n", secretdata->Length); return 0; } int delete_data(void) { LSA_HANDLE ph; DWORD status; status = LsaOpenPolicy(NULL, &lsa_object_attributes, POLICY_ALL_ACCESS, &ph); if (status != 0) { printf("LsaOpenPolicy: %X\n", status); return status; } status = LsaStorePrivateData(ph, &keyname, NULL); if (status != 0) { printf("LsaStorePrivateData: %X\n", status); return status; } printf("Success!\n"); return 0; } int wmain(int argc, wchar_t ** argv) { keyname.Length = wcslen(keyname_string) * 2; keyname.MaximumLength = keyname.Length + 2; keyname.Buffer = keyname_string; lsa_object_attributes.Length = sizeof(lsa_object_attributes); lsa_object_attributes.RootDirectory = NULL; lsa_object_attributes.ObjectName = NULL; lsa_object_attributes.Attributes = 0; lsa_object_attributes.SecurityDescriptor = NULL; lsa_object_attributes.SecurityQualityOfService = NULL; if (argc > 1) { if (_wcsicmp(argv[1], L"set") == 0) { return set(); } if (_wcsicmp(argv[1], L"delete") == 0) { return delete_data(); } else if (_wcsicmp(argv[1], L"get") == 0) { if (argc == 2) { return get(NULL); } else if (argc == 3) { return get(argv[2]); } } } printf("Syntax:\n" "testprivatedata set\n" "testprivatedata get\n" "testprivatedata get \\\\target\n" "testprivatedata delete\n"); return 1; }