VeraCrypt

Документация >> Требования безопасности и меры предосторожности >> Защита памяти в VeraCrypt

Защита памяти в VeraCrypt

Введение

VeraCrypt всегда стремится улучшить взаимодействие с пользователем, сохраняя при этом наивысший уровень безопасности. Одна из таких функций безопасности – механизм защиты памяти. Однако для тех пользователей, которым требуются специальные возможности взаимодействия с ОС, мы предоставили возможность отключить этот механизм.

Общие сведения

Защита памяти гарантирует, что процессам, не являющимся административными, запрещён доступ к памяти процесса VeraCrypt. Это служит двум основным целям:

Зачем нужна опция отключения защиты памяти?

Некоторым инструментам специальных возможностей, таким как экранный диктор, требуется доступ к памяти процессов ПО для эффективной интерпретации пользовательского интерфейса (UI) и взаимодействия с ним. Защита памяти VeraCrypt непреднамеренно препятствовала работе таких инструментов. Чтобы гарантировать, что пользователи смогут беспрепятственно применять инструменты специальных возможностей в VeraCrypt, мы и ввели эту опцию отключения защиты.

Как включить/отключить защиту памяти?

По умолчанию защита памяти включена. Её можно отключить через главное окно VeraCrypt или во время установки.

  1. Во время установки:
    • В мастере установки найдите опцию Отключить защиту памяти для совместимости со специальными возможностями.
    • Установите флажок, если хотите отключить защиту памяти. Оставьте этот флажок снятым, чтобы продолжать использовать защиту памяти.
    • Приступайте к остальной части установки.
  2. После установки:
    • Откройте VeraCrypt и в меню Настройки выберите пункт Производительность и драйвер.
    • Найдите и установите/снимите флажок с опции Отключить защиту памяти для совместимости со специальными возможностями согласно вашим потребностям. Появится уведомление, что для вступления изменений в силу необходима перезагрузка ОС.
    • Нажмите OK.
  3. При обновлении или исправлении/переустановке:
    • В мастере установки найдите опцию Отключить защиту памяти для совместимости со специальными возможностями.
    • Найдите и установите/снимите флажок с опции Отключить защиту памяти для совместимости со специальными возможностями согласно вашим потребностям.
    • Приступайте к остальной части обновления или исправления/переустановки.
    • Если вы изменили настройку защиты памяти, появится уведомление, что необходима перезагрузка ОС.

О потенциальных рисках

Хотя отключение защиты памяти может быть важным для некоторых пользователей, необходимо понимать связанные с этим риски:

Вопросы и ответы

По умолчанию защита памяти включена или выключена?
Защита памяти по умолчанию включена.

Как узнать, включена или отключена защита памяти?
Проверить состояние защиты памяти можно из главного окна VeraCrypt. Перейдите в меню Настройки и выберите пункт Производительность и драйвер. Если опция Отключить защиту памяти для совместимости со специальными возможностями включена, то защита памяти отключена. Если эта опция отключена, то защита памяти включена.

Снизит ли отключение защиты памяти надёжность шифрования VeraCrypt?
Нет, алгоритмы шифрования и их надёжность остаются прежними. Затрагивается только защита от потенциального перехвата памяти и внедрения в неё процессов, не являющимися административными.

Я не пользуюсь инструментами специальных возможностей. Нужно ли мне отключить эту функцию?
Нет, лучше оставить защиту памяти включённой для дополнительной безопасности.

.highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 Copyright (c) 2014 IDRIX. All rights reserved.

 Governed by the VeraCrypt License the full text of which is contained in
 the file License.txt included in VeraCrypt binary and source code distribution
 packages.
*/

#ifndef TC_HEADER_Main_Forms_WaitDialog
#define TC_HEADER_Main_Forms_WaitDialog

#include "Forms.h"
#include "Main/Main.h"
#include "Main/Application.h"
#include <wx/msgqueue.h>

namespace VeraCrypt
{

	DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, -1);
	DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, -1);
	DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_PIN, -1);
	DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, -1);
	
	class WaitDialog;



	class WaitThread : public wxThread
	{
	public:
		WaitThread(WaitDialog *handler, WaitThreadRoutine* pRoutine) : wxThread(wxTHREAD_DETACHED), m_pRoutine(pRoutine)
		{
			m_pHandler = handler;			
		}
		~WaitThread()
		{			
		}
		
	protected:
		virtual ExitCode Entry();
		WaitDialog *m_pHandler;
		WaitThreadRoutine* m_pRoutine;
	};

	class WaitDialog : public WaitDialogBase, public WaitThreadUI
	{
	public:
		WaitDialog (wxWindow *parent, const wxString& label, WaitThreadRoutine* pRoutine) 
			: WaitDialogBase(parent), WaitThreadUI(pRoutine), m_timer (this)
		{
			WaitStaticText->SetLabel (label);
			WaitProgessBar->Pulse();
			Layout();
			GetSizer()->Fit( this );
			Centre( wxBOTH );
			Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
			Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
			Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
			Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
			
			Connect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ), NULL, this );
			m_thread = new WaitThread(this, pRoutine);
		}
		
		~WaitDialog()
		{
			Disconnect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ));
			Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
			Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
			Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
			Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
		}

		virtual void OnWaitDialogInit( wxInitDialogEvent& event )
		{	
			m_thread->Run();
			m_timer.Start(100);
		}

		int GetCharWidth (wxWindow *window) const
		{
			int width;
			int height;
			window->GetTextExtent (L"a", &width, &height);

			if (width < 1)
				return 7;

			return width;
		}

		class ShowMessageParam
		{
		public:
			wxString m_message;
			wxString m_caption;
			long m_style;
			bool m_topMost;
			ShowMessageParam(const wxString &message, const wxString &caption,long style, bool topMost)
				: m_message(message), m_caption(caption), m_style(style), m_topMost(topMost)
			{}
		};

		int RequestShowMessage (const wxString &message, const wxString &caption,long style, bool topMost)
		{
			long lResult = -1;
			if (m_queue.IsOk())
			{
				wxString sResult;
				ShowMessageParam* pParam = new ShowMessageParam(message, caption, style, topMost);
				wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_SHOW_MSG,0);
				pEvent->SetClientData (pParam);
				wxQueueEvent (this, pEvent);
				m_queue.Receive (sResult);
				sResult.ToLong(&lResult);
			}	
			return (int) lResult;
		}

		void RequestAdminPassword (wxString& adminPassword)
		{
			if (m_queue.IsOk())
			{
				wxQueueEvent (this, new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD,0));
				if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (adminPassword))
					adminPassword = wxT("");
			}
			else
				adminPassword = wxT("");
		}

		void RequestPin (wxString& pin)
		{
			if (m_queue.IsOk())
			{
				wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_PIN,0);
				pEvent->SetString (pin);
				wxQueueEvent (this, pEvent);
				if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (pin))
					pin = wxT("");
			}
			else
				pin = wxT("");
		}
		
		// virtual void OnWaitDialogClose( wxCloseEvent& event ) { }
		void OnThreadCompletion(wxCommandEvent &)
		{
			m_queue.Clear();
			EndModal(0);
		}

		void OnAdminPasswordRequest(wxCommandEvent &)
		{

			wxPasswordEntryDialog dialog (this, _("Enter your user password or administrator password:"), _("Administrator privileges required"));
			if (dialog.ShowModal() != wxID_OK)
				m_queue.Post(wxT(""));
			else
				m_queue.Post(dialog.GetValue());
		}



		void OnPinRequest(wxCommandEvent &e)
		{

			wxPasswordEntryDialog dialog (this, wxString::Format (LangString["ENTER_TOKEN_PASSWORD"], e.GetString()), LangString["IDD_TOKEN_PASSWORD"]);
			dialog.SetSize (wxSize (GetCharWidth (&dialog) * 50, -1));

			if (dialog.ShowModal() != wxID_OK)
				m_queue.Post(wxT(""));
			else
				m_queue.Post(dialog.GetValue());
		}

		void OnShowMsg(wxCommandEvent &e)
		{
			ShowMessageParam* pParam = (ShowMessageParam*) e.GetClientData();
			if (pParam->m_topMost)
			{
				if (!IsActive())
					RequestUserAttention (wxUSER_ATTENTION_ERROR);

				pParam->m_style |= wxSTAY_ON_TOP;
			}

			int iResult = wxMessageBox (pParam->m_message, pParam->m_caption, pParam->m_style, this);
			delete pParam;		
			m_queue.Post(wxString::Format(wxT("%d"), iResult));
		}
		
		void OnProgressTimer(wxTimerEvent& event)
		{
			WaitProgessBar->Pulse();
		}

		virtual void Run(void) { ShowModal(); if (m_pRoutine->HasException()) ThrowException(m_pRoutine->m_pException); }

		void ThrowException(Exception* ex);

	protected:
		WaitThread* m_thread;
		wxTimer m_timer;
		wxMessageQueue<wxString> m_queue;
	};
}

#endif // TC_HEADER_Main_Forms_WaitDialog