문제

나는이 해킹을 생각해 냈을 때 현지화 가능한 LUA 문자열 솔루션을 연구하고 있었는데, 문제는 해킹을 피하는 방법을 모르겠다는 것입니다. 이런 종류의 공격으로부터 보호합니다. (사용자 코드)

우리는 이것을 할 수 있기 때문에 :

=("foo"):upper() -->output: FOO

다음과 같이 해킹 될 수 있습니다.

getmetatable("foo").__index.upper = function() print("bye bye sucker");os.exit() end
=("foo"):upper() -->output: bye bye sucker (application quits)
-- or this way
=string.upper("bar") -->output: bye bye sucker (application quits)

어떤 아이디어?

도움이 되었습니까?

해결책

가장 먼저 다른 포스터에서 말한 것처럼 샌드 박스 환경에서만 신뢰할 수없는 코드를 실행합니다. Bytecode 청크 로딩을 제외하고 LUA는 다른 모든 샌드 박스 문제를 다룰 수 있도록합니다. (및 바이트 코드 청크 문제가 발견 된대로 신속하게 수정됩니다.)

보다 루아 라이브 데모 샌드 박스의 예는. 출처를 사용할 수 있습니다 여기.

Metatables의 특정 문제는 설정하여 해결됩니다. __metatable 필드:

당신이 a를 설정하면 __metatable 중족기의 필드, getmetatable 이 필드의 가치를 반환합니다 setmetatable 오류가 발생합니다.

- Roberto Ierusalimschy, Lua 1st Edition의 프로그래밍, 13.3- 라이브러리 정의 된 메타 메트 드

예를 들어:

> mt = { __metatable = true }                                                   
> t = {}
> setmetatable(t, mt)
> setmetatable(t, mt)
stdin:1: cannot change a protected metatable
stack traceback:
 [C]: in function 'setmetatable'
 stdin:1: in main chunk
 [C]: ? 

따라서, 당신이해야 할 일은 다음과 같습니다.

getmetatable("").__metatable = true

다른 팁

해커가 코드를 추가 할 수있는 기능이 있고 해당 코드가 os.exit과 같은 것을 호출하도록 허용 해야하는 경우 어쨌든 운이 좋지 않습니다.

그러나 코드가 호출 할 수있는 기능을 제한 할 수 있습니다. 여전히 사용자 코드가 할 수있는 것에 따라 다릅니다. Setfenv의 문서 및 "Lua Sandbox"의 Doc을 참조하십시오.

샌드 박스에 대해 이미 알고 있기 때문에 왜 문제가 있는지 확실하지 않습니다. io.exit과 같은 위험한 기능을 제거 할 수 있으며, 재정의 기능이 사용자의 글로벌 테이블에있는 것인지 확인할 수 있습니다. 응용 프로그램에서 내부적으로 사용하는 LUA 기능은 그대로 유지됩니다.
어쨌든 해커가 OS.Exit을 직접 호출 할 수 있다면 나중에 사용할 수있는 무고한 기능을 과급하여 발에서 자신을 쏠 수 있다는 사실은 그의 문제입니다.
게다가, 예를 들어 서버에서 사용자 기능을 실행하는 경우에만 문제가됩니다. 예를 들어 해커가 시스템을 파괴하면 다시 그의 문제입니다!
이제 위험한 코드를 배포하는 문제도 있습니다. 사용자 스크립트의 힘을 제한하는 것은 귀하에게 달려 있습니다. 결국, 바로 브라우저가 JavaScript로하는 일입니다.

이것 보안 문제 Ford Prefect가 화려한 책에서 말한이 문장으로 일반적으로 설명됩니다. 은하수를 여행하는 히치하이커를위한 안내서: 오히려이 밀폐 된 해치 웨이의 반대편에있는 것과 관련이 있습니다.

코드 작성 능력은 보안 취약점이라고 말할 수 없으며 코드를 제어 할 수없는 경우 저것 해당 코드가 할 수있는 일이 아니라 보안 문제입니다.

기계가 코드 중 일부를 실행할 수 있다면 할 수있는 일이 많이 있습니다. 보안은 처음에 코드를 입력하지 않는 것입니다. 그 후 모든 것은 단지 담보 손상입니다.

이 문제에 의해 해킹 당하지 않는 방법은 알 수없는 코드를 응용 프로그램에 얻는 것을 피하는 것입니다.

나는 재정의 할 가능성이 없다 upper 문제로. 볼 수 있습니다 os.exit 문제입니다.

다른 사람들이 제안한 바와 같이, 스크립트를위한 샌드 박스 환경을 만듭니다. 각 스크립트는 새로운 스크립트를 얻을 수 있습니다. 그런 다음 사람은 상단이나 그와 비슷한 것을 재정의 할 수 있으며, 그들이 망칠 모든 것은 그들 자신의 것입니다.

LUA 상태를 만드는 것은 너무 빠르고 쉽기 때문에 문제가 발생하지 않습니다.

당신이 조심할 수있는 또 다른 것은 영원한 루프입니다. 100000 명령에 약 10 줄의 C 코드가 필요합니다. 필요한 경우 샘플을 보낼 수 있습니다.

나는 해결책이 없지만 (나는 Lua를 사용하지 않고, 멀리서 그것에 관심이 있습니다), 당신이 뒤 따르는 것은 "샌드 박스"라고합니다. Google을위한 루아 샌드 박스, 나는 그런 식으로 겉보기에 흥미로운 페이지를 발견했습니다. 예를 들어: http://lua-users.org/wiki/sandboxes.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top