setregid(real_gid, effective_gid)
으로 루트 권한을 삭제하려고합니다. 둘 다 1000으로 설정되어 있지만 id 명령을 실행하면 그룹 목록에 루트가 있습니다! 어떻게 제거합니까? root
(0)에서 해당 목록을 제거 -C/Linux : setgid는 그룹 목록에 루트를 남깁니다
답변
root
가 만드는 여러 그룹 중 하나 인 경우에는 번의 보조 그룹 목록을 조정 getgroups()
및 setgroups()
를 사용해야합니다. POSIX는 getgroups()
을 지정하지만 setgroups()
을 지정하지 않습니다.
당신은 아마이 유사한 코드를 사용하십시오 root
그룹은 리눅스에 0이지만, 그룹 0의 이름은 항상 root
아니라고
enum { MAX_AUX_GROUPS = 16 }; // Reasonable number
enum { ROOT_GROUP = 0 }; // Platform specific
gid_t aux_groups[MAX_AUX_GROUPS];
int ngroups = getgroups(MAX_AUX_GROUPS, aux_groups);
if (ngroups > 0)
{
int dst = 0;
for (int i = 0; i < ngroups; i++)
{
if (aux_groups[i] != ROOT_GROUP)
aux_groups[dst++] = aux_groups[i];
}
ngroups = dst;
}
if (ngroups > 0)
{
if (setgroups(ngroups, aux_groups) != 0)
...report error...
}
주 (예는 AIX에 system
및 wheel
에있다 MacOS X), 모든 시스템이 그룹 root
(AIX 나 MacOS X가 아닌)을 가지고있는 것은 아닙니다. 커널은 그룹 0이기 때문에 그룹 0에 특별한 권한을 부여하지 않습니다 (사용자 0에게는 특별한 권한을 부여하는 반면).
생략하려는 그룹을 찾아 코드를 일반화 할 수 있습니다. POSIX는 NGROUPS_MAX도 제공한다. MAX_AUX_GROUPS 대신이 값을 사용할 수 있습니다. 표준 페이지에서도 다음을 제안합니다 :
long ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
gid_t *group = (gid_t *)malloc(ngroups_max *sizeof(gid_t));
덕분에 도와 줬습니다. :) – Daniel
루트를 버리는 경우 거의 모든 ** 루트의 보충 그룹을 없애고 싶을뿐입니다. 단지'0 '이 아니라'getgroups'을 건너 뛰고 빈리스트를 'setgroups'. 또는 그룹 파일에서 대상 사용자의 보충 그룹을 설정하려면 정확하게 수행 할 수있는 (비표준이지만 전통적으로 사용 가능한)'initgroups' 함수가 있습니다. –
@R .. : 좋은 지적. 일반 사용자가 6 개의 그룹에 속해 있고 setuid/setgid 프로그램이 상승 된 권한을 삭제하려는 경우 사용자의 6 개 그룹 만 남겨 두어야한다고 주장 할 수 있습니다. 물론, 사용자의 그룹 목록에는 처음에는 '루트'가 포함되어서는 안됩니다. 그래서 상황은 조금 불분명합니다. 'setgroups()'를 0 또는 1 그룹 (유효 그룹 ID,'getgroups()'이 유효 그룹 ID를 반환하는지 여부를 정의하는 구현)을 사용할 수있다. initgroups() 함수는 사용자 이름과 그룹 ID를 취하여 그룹 목록이 올바르게 설정되었는지 확인합니다. –
- 1. CarrierWave를 사용하여 그림자를 남깁니다.
- 2. ImageView에 적용된 TranslateAnimation이 흔적을 남깁니다.
- 3. Django ORM은 열린 연결을 남깁니다.
- 4. Font.createFont 임시 디렉토리에 파일을 남깁니다.
- 5. PHP 루트를 포함하는 방법
- 6. 루트를 제공하는 nginx 규칙
- 7. 환경에서 레일스 루트를 설정하십시오.
- 8. 플렉스 4 - GC 루트를 만드는 이유는 무엇입니까?
- 9. 각 잎의 루트를 기준으로 트리를 구현
- 10. 그룹 텍스트 상자를 Windows Form 응용 프로그램의 목록에 추가하려면
- 11. WPF 데이터 바인딩 루트를 사용하여 TreeView를 만들고 자식을 목록에 바인딩하는 방법? 예를 들어
- 12. 인증서의 루트를 결정하는 방법은 무엇입니까?
- 13. mod_rewrite : 어딘가에 루트를 다시 작성
- 14. asp.net 웹 사이트 루트를 변경
- 15. Zend disableLayout() 출력에 html & body 태그를 남깁니다.
- 16. C 파일 읽기가 가비지 문자를 남깁니다.
- 17. iPhone UITextView는 하단에 2 줄의 공간을 남깁니다.
- 18. jquery는 모든 자식 요소를 제거하고 텍스트를 남깁니다.
- 19. 크리스탈 보고서 섹션이 여전히 비어있는 부분을 남깁니다.
- 20. PHP 컬은 디렉토리에 파일을 남깁니다. 정리 방법
- 21. 문자열의 점을 바꾸지 만 마지막 하나는 남깁니다.
- 22. GridView와 ListView를 번갈아 가며 가공물을 남깁니다.
- 23. 퀵타임 긴로드 시간은로드하기 전에 빈 영역을 남깁니다.
- 24. 저장소에 집계 루트를 추가하는 방법은 무엇입니까?
- 25. cakephp에있는 그룹 그룹
- 26. Grep 그룹 그룹
- 27. 그룹
- 28. 그룹
- 29. 그룹
- 30. 다른 그룹 용량의 그룹 조합
이것은 그룹 목록으로 프로그래밍하는 방법에 대한 정당한 질문입니다. 그것은 StackOverflow에 대한 오프 주제가 아닙니다. –