4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd All Rights Reserved
6 * Contact: Bumjin Im <bj.im@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License
27 #include <sys/types.h>
33 #include <sys/smack.h>
34 #include <sys/types.h>
35 #include <sys/socket.h>
38 #include "security-server-cookie.h"
39 #include "security-server-common.h"
40 #include "security-server-password.h"
41 #include "security-server-comm.h"
43 /* Set cookie as a global variable */
45 pthread_mutex_t cookie_mutex;
46 int thread_status[SECURITY_SERVER_NUM_THREADS];
47 struct security_server_thread_param {
53 /************************************************************************************************/
54 /* Just for test. This code must be removed on release */
55 #include "security-server-util.h"
56 /************************************************************************************************/
59 void printhex(unsigned char *data, int size)
67 printf("%X ", data[i]);
68 if(((i+1) % 16) == 0 && i != 0)
74 void print_cookie(cookie_list *list)
77 printf("%s", "cookie:\n");
78 printhex(list->cookie, SECURITY_SERVER_COOKIE_LEN);
79 printf("path_len: %d\n", list->path_len);
80 printf("permission_len: %d\n", list->permission_len);
81 printf("PID: %d\n", list->pid);
82 printf("path: %s\n", list->path);
83 printf("%s", "permissions: ");
84 for(i=0;i<list->permission_len;i++)
86 printf("%d ", list->permissions[i]);
89 printf("prev: %p\n", list->prev);
90 printf("next: %p\n", list->next);
94 /* Object name is actually name of a Group ID *
95 * This function opens /etc/group file and search group ID and
96 * returns the string */
97 int search_object_name(int gid, char *obj, int obj_size)
100 char *linebuf = NULL, *token = NULL, *token2, *tempstr = NULL;
101 int ret = 0, tmp_gid, bufsize;
102 fp = fopen("/etc/group", "r");
105 /* cannot open /etc/group */
106 SEC_SVR_DBG("%s", "Cannot open /etc/group");
107 return SECURITY_SERVER_ERROR_FILE_OPERATION;
110 linebuf = malloc(128);
114 ret = SECURITY_SERVER_ERROR_OUT_OF_MEMORY;
115 SEC_SVR_DBG("%s", "cannot malloc()");
119 bzero(linebuf, bufsize);
120 ret = SECURITY_SERVER_ERROR_NO_SUCH_OBJECT;
121 while(fgets(linebuf, bufsize, fp) != NULL)
123 while(linebuf[bufsize -2] != 0)
125 linebuf[bufsize -1] = (char) fgetc(fp);
126 tempstr = realloc(linebuf, bufsize + 128);
129 ret = SECURITY_SERVER_ERROR_OUT_OF_MEMORY;
133 bzero(linebuf + bufsize, 128);
134 fgets(linebuf + bufsize, 128, fp);
138 token = strtok(linebuf, ":"); /* group name */
141 SEC_SVR_DBG("/etc/group is not valid. cannot find gid: [%s]", linebuf);
142 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
145 token2 = strtok(NULL, ":"); /* group password */
148 SEC_SVR_DBG("/etc/group is not valid. cannot find gid: [%s]", linebuf);
149 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
152 token2 = strtok(NULL, ":"); /* gid */
155 SEC_SVR_DBG("/etc/group is not valid. cannot find gid: [%s]", linebuf);
156 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
161 tmp_gid = strtoul(token2, 0, 10);
164 SEC_SVR_DBG("cannot change string to integer [%s]", token2);
165 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
172 if((int)strlen(token) > obj_size)
174 ret = SECURITY_SERVER_ERROR_BUFFER_TOO_SMALL;
175 SEC_SVR_DBG("buffer is too small. %d --> %d", obj_size, strlen(token));
178 strncpy(obj, token, strlen(token));
179 obj[strlen(token)] = 0;
180 ret = SECURITY_SERVER_SUCCESS;
183 bzero(linebuf, bufsize);
194 /* Search GID from group name *
195 * This function opens /etc/group and search group name by given gid */
196 int search_gid(const char *obj)
199 char *linebuf = NULL, *token = NULL, *token2, *tempstr = NULL;
200 int ret = SECURITY_SERVER_ERROR_NO_SUCH_OBJECT, tmp_gid, bufsize;
202 SEC_SVR_DBG("Searching for object %s", obj);
204 fp = fopen("/etc/group", "r");
207 /* cannot open /etc/group */
208 SEC_SVR_DBG("%s", "cannot open /etc/group");
209 return SECURITY_SERVER_ERROR_FILE_OPERATION;
212 linebuf = malloc(128);
216 ret = SECURITY_SERVER_ERROR_OUT_OF_MEMORY;
217 SEC_SVR_DBG("%s", "Out Of Memory");
221 bzero(linebuf, bufsize);
222 while(fgets(linebuf, bufsize, fp) != NULL)
224 while(linebuf[bufsize -2] != 0 )
226 linebuf[bufsize -1] = (char) fgetc(fp);
227 tempstr = realloc(linebuf, bufsize + 128);
230 ret = SECURITY_SERVER_ERROR_OUT_OF_MEMORY;
234 bzero(linebuf + bufsize, 128);
235 fgets(linebuf + bufsize, 128, fp);
239 token = strtok(linebuf, ":"); /* group name */
240 token2 = strtok(NULL, ":"); /* group password */
241 token2 = strtok(NULL, ":"); /* gid */
244 SEC_SVR_DBG("/etc/group is not valid. cannot find gid: [%s]", linebuf);
245 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
249 tmp_gid = strtoul(token2, 0, 10);
252 SEC_SVR_DBG("cannot change string to integer [%s]", token2);
253 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
257 if(strcmp(obj, token) == 0)
261 SEC_SVR_DBG("GID of %s is found: %d", obj, ret);
264 bzero(linebuf, bufsize);
275 /* Signal handler for processes */
276 static void security_server_sig_child(int signo, siginfo_t *info, void *data)
285 child_pgid = getpgid(info->si_pid);
286 SEC_SVR_DBG("Signal handler: dead_pid=%d, pgid=%d",info->si_pid,child_pgid);
288 while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) {
289 if(child_pid == child_pgid)
290 killpg(child_pgid,SIGKILL);
296 /* Execute a debugging tool by fork() and execve() */
297 int execute_debug_tool(int argc, char *const *argv, int server_sockfd, int client_sockfd)
300 SEC_SVR_DBG("%s", "Executing tool");
307 close(client_sockfd);
308 close(server_sockfd);
314 ret = execv(argv[0], argv);
317 SEC_SVR_DBG("Error:Failed to execute [%d]", errno);
323 SEC_SVR_DBG("Error: Failed to fork [%d]", errno);
324 return SECURITY_SERVER_ERROR_SERVER_ERROR;
326 return SECURITY_SERVER_SUCCESS;
329 int process_cookie_request(int sockfd)
331 int retval, client_pid, client_uid;
332 cookie_list *created_cookie = NULL;
334 /* Authenticate client */
335 retval = authenticate_client_application(sockfd, &client_pid, &client_uid);
336 if(retval != SECURITY_SERVER_SUCCESS)
338 SEC_SVR_DBG("%s", "Client Authentication Failed");
339 retval = send_generic_response(sockfd,
340 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
341 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
342 if(retval != SECURITY_SERVER_SUCCESS)
344 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
348 /* If client application is root process, just respond default cookie */
352 SEC_SVR_DBG("%s", "Requested application is a root process");
353 created_cookie = c_list;
356 SEC_SVR_DBG("%s", "Cannot read default cookie");
363 //TODO: Remove above code if there will be no crashes without it
364 //All process should be treaded the same
365 /* Create a new cookie. or find existing one */
366 pthread_mutex_lock(&cookie_mutex);
367 created_cookie = create_cookie_item(client_pid, sockfd, c_list);
368 pthread_mutex_unlock(&cookie_mutex);
369 if(created_cookie == NULL)
371 SEC_SVR_DBG("%s","Cannot create a cookie");
375 //let others know if this cookie belongs to root process
377 created_cookie->is_roots_process = 1;
379 created_cookie->is_roots_process = 0;
382 /* send cookie as response */
383 retval = send_cookie(sockfd, created_cookie->cookie);
384 if(retval != SECURITY_SERVER_SUCCESS)
386 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
388 SEC_SVR_DBG("Server: Cookie created for client PID %d LABEL >%s<",
390 (created_cookie->smack_label)?(created_cookie->smack_label):"NULL");
392 SEC_SVR_DBG("%s", "Server: Cookie has been sent to client");
398 int process_check_privilege_request(int sockfd)
400 /* Authenticate client */
401 int retval, client_pid, requested_privilege;
403 unsigned char requested_cookie[SECURITY_SERVER_COOKIE_LEN];
404 cookie_list *search_result = NULL;
406 retval = authenticate_client_middleware(sockfd, &client_pid);
407 if(retval != SECURITY_SERVER_SUCCESS)
409 SEC_SVR_DBG("%s", "Client Authentication Failed");
410 retval = send_generic_response(sockfd,
411 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
412 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
413 if(retval != SECURITY_SERVER_SUCCESS)
415 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
420 retval = recv_check_privilege_request(sockfd,
421 requested_cookie, &requested_privilege);
422 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED)
424 SEC_SVR_DBG("%s", "Receiving request failed");
425 retval = send_generic_response(sockfd,
426 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
427 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
428 if(retval != SECURITY_SERVER_SUCCESS)
430 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
435 if(requested_privilege < 1)
437 SEC_SVR_DBG("Requiring bad privilege [%d]", requested_privilege);
438 retval = send_generic_response(sockfd,
439 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
440 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
441 if(retval != SECURITY_SERVER_SUCCESS)
443 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
448 /* Search cookie list */
449 pthread_mutex_lock(&cookie_mutex);
450 privileges[0] = requested_privilege;
451 search_result = search_cookie(c_list, requested_cookie, privileges, 1);
452 pthread_mutex_unlock(&cookie_mutex);
453 if(search_result != NULL)
456 SEC_SVR_DBG("We found the cookie with %d privilege and pid:%d", requested_privilege, client_pid);
457 SEC_SVR_DBG("%s", "Cookie comparison succeeded. Access granted.");
458 retval = send_generic_response(sockfd,
459 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
460 SECURITY_SERVER_RETURN_CODE_ACCESS_GRANTED);
461 if(retval != SECURITY_SERVER_SUCCESS)
463 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
469 SEC_SVR_DBG("Could not find the cookie with %d privilege", requested_privilege);
470 retval = send_generic_response(sockfd,
471 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
472 SECURITY_SERVER_RETURN_CODE_ACCESS_DENIED);
473 if(retval != SECURITY_SERVER_SUCCESS)
475 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
482 int process_check_privilege_new_request(int sockfd)
484 /* Authenticate client */
485 int retval, client_pid, requested_privilege;
486 unsigned char requested_cookie[SECURITY_SERVER_COOKIE_LEN];
487 cookie_list *search_result = NULL;
488 char object_label[MAX_OBJECT_LABEL_LEN+1];
489 char access_rights[MAX_MODE_STR_LEN+1];
491 retval = authenticate_client_middleware(sockfd, &client_pid);
492 if(retval != SECURITY_SERVER_SUCCESS)
494 SEC_SVR_DBG("%s", "Client Authentication Failed");
495 retval = send_generic_response(sockfd,
496 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_RESPONSE,
497 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
498 if(retval != SECURITY_SERVER_SUCCESS)
500 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
505 retval = recv_check_privilege_new_request(
506 sockfd, requested_cookie, object_label, access_rights);
507 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED)
509 SEC_SVR_DBG("%s", "Receiving request failed");
510 retval = send_generic_response(sockfd,
511 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_RESPONSE,
512 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
513 if(retval != SECURITY_SERVER_SUCCESS)
515 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
520 /* Search cookie list */
521 pthread_mutex_lock(&cookie_mutex);
522 search_result = search_cookie_new(c_list, requested_cookie, object_label, access_rights);
523 pthread_mutex_unlock(&cookie_mutex);
525 if(search_result != NULL)
528 SEC_SVR_DBG("We found the cookie with %s rights and pid:%d", access_rights, client_pid);
529 SEC_SVR_DBG("%s", "Cookie comparison succeeded. Access granted.");
530 retval = send_generic_response(sockfd,
531 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_RESPONSE,
532 SECURITY_SERVER_RETURN_CODE_ACCESS_GRANTED);
533 if(retval != SECURITY_SERVER_SUCCESS)
535 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
541 SEC_SVR_DBG("Could not find the cookie with %s rights", access_rights);
542 retval = send_generic_response(sockfd,
543 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_RESPONSE,
544 SECURITY_SERVER_RETURN_CODE_ACCESS_DENIED);
545 if(retval != SECURITY_SERVER_SUCCESS)
547 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
556 int process_object_name_request(int sockfd)
558 int retval, client_pid, requested_privilege;
559 char object_name[SECURITY_SERVER_MAX_OBJ_NAME];
561 /* Authenticate client */
562 retval = authenticate_client_middleware(sockfd, &client_pid);
563 if(retval != SECURITY_SERVER_SUCCESS)
565 SEC_SVR_DBG("%s", "Client Authentication Failed");
566 retval = send_generic_response(sockfd,
567 SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_RESPONSE,
568 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
569 if(retval != SECURITY_SERVER_SUCCESS)
571 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
577 retval = read(sockfd, &requested_privilege, sizeof(requested_privilege));
578 if (retval < (int)sizeof(requested_privilege))
580 SEC_SVR_DBG("%s", "Receiving request failed");
581 retval = send_generic_response(sockfd,
582 SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_RESPONSE,
583 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
584 if(retval != SECURITY_SERVER_SUCCESS)
586 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
591 /* Search from /etc/group */
592 retval = search_object_name(requested_privilege,
594 SECURITY_SERVER_MAX_OBJ_NAME);
595 if (retval == SECURITY_SERVER_ERROR_NO_SUCH_OBJECT)
598 SEC_SVR_DBG("There is no such object for gid [%d]", requested_privilege);
599 retval = send_generic_response(sockfd,
600 SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_RESPONSE,
601 SECURITY_SERVER_RETURN_CODE_NO_SUCH_OBJECT);
602 if(retval != SECURITY_SERVER_SUCCESS)
604 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
608 if(retval != SECURITY_SERVER_SUCCESS)
611 SEC_SVR_DBG("Error on searching object name [%d]", retval);
612 retval = send_generic_response(sockfd,
613 SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_RESPONSE,
614 SECURITY_SERVER_RETURN_CODE_SERVER_ERROR);
615 if(retval != SECURITY_SERVER_SUCCESS)
617 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
623 SEC_SVR_DBG("We found object: %s", object_name);
624 retval = send_object_name(sockfd, object_name);
625 if(retval != SECURITY_SERVER_SUCCESS)
627 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
634 int process_gid_request(int sockfd, int msg_len)
636 int retval, client_pid;
637 char object_name[SECURITY_SERVER_MAX_OBJ_NAME];
638 /* Authenticate client as middleware daemon */
639 retval = authenticate_client_middleware(sockfd, &client_pid);
640 if(retval != SECURITY_SERVER_SUCCESS)
642 SEC_SVR_DBG("%s", "Client authentication failed");
643 retval = send_generic_response(sockfd,
644 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
645 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
646 if(retval != SECURITY_SERVER_SUCCESS)
648 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
653 if(msg_len >= SECURITY_SERVER_MAX_OBJ_NAME)
655 /* Too big ojbect name */
656 SEC_SVR_DBG("%s", "Object name is too big");
657 retval = send_generic_response(sockfd,
658 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
659 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
660 if(retval != SECURITY_SERVER_SUCCESS)
662 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
667 /* Receive group name */
668 retval = read(sockfd, object_name, msg_len);
669 if (retval < msg_len )
671 SEC_SVR_DBG("%s", "Failed to read object name");
672 retval = send_generic_response(sockfd,
673 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
674 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
675 if(retval != SECURITY_SERVER_SUCCESS)
677 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
681 object_name[msg_len] = 0;
683 /* Search /etc/group for the given group name */
684 retval = search_gid(object_name);
685 if (retval == SECURITY_SERVER_ERROR_NO_SUCH_OBJECT)
688 SEC_SVR_DBG("The object [%s] is not exist", object_name);
689 retval = send_generic_response(sockfd,
690 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
691 SECURITY_SERVER_RETURN_CODE_NO_SUCH_OBJECT);
692 if(retval != SECURITY_SERVER_SUCCESS)
694 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
702 SEC_SVR_DBG("Cannot send the response. %d", retval);
703 retval = send_generic_response(sockfd,
704 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
705 SECURITY_SERVER_RETURN_CODE_SERVER_ERROR);
706 if(retval != SECURITY_SERVER_SUCCESS)
708 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
714 retval = send_gid(sockfd, retval);
715 if(retval != SECURITY_SERVER_SUCCESS)
717 SEC_SVR_DBG("ERROR: Cannot gid response: %d", retval);
723 int process_pid_request(int sockfd)
725 int retval, client_pid;
726 unsigned char requested_cookie[SECURITY_SERVER_COOKIE_LEN];
727 int * privileges = NULL;
728 cookie_list *search_result = NULL;
730 /* Authenticate client */
731 retval = authenticate_client_middleware(sockfd, &client_pid);
732 if(retval != SECURITY_SERVER_SUCCESS)
734 SEC_SVR_DBG("%s", "Client Authentication Failed");
735 retval = send_generic_response(sockfd,
736 SECURITY_SERVER_MSG_TYPE_PID_RESPONSE,
737 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
738 if(retval != SECURITY_SERVER_SUCCESS)
740 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
745 retval = recv_pid_request(sockfd, requested_cookie);
746 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED)
748 SEC_SVR_DBG("%s", "Receiving request failed");
749 retval = send_generic_response(sockfd,
750 SECURITY_SERVER_MSG_TYPE_PID_RESPONSE,
751 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
752 if(retval != SECURITY_SERVER_SUCCESS)
754 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
759 retval = get_client_gid_list(sockfd, &privileges);
762 SEC_SVR_DBG("ERROR: Cannot get GID list");
766 /* Search cookie list */
767 pthread_mutex_lock(&cookie_mutex);
768 search_result = search_cookie(c_list, requested_cookie, privileges, retval);
769 pthread_mutex_unlock(&cookie_mutex);
773 if(search_result != NULL)
776 SEC_SVR_DBG("We found the cookie and pid:%d", search_result->pid);
777 SEC_SVR_DBG("%s", "Cookie comparison succeeded. Access granted.");
778 retval = send_pid(sockfd, search_result->pid);
780 if(retval != SECURITY_SERVER_SUCCESS)
782 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
788 SEC_SVR_DBG("%s", "Could not find the cookie");
789 retval = send_generic_response(sockfd,
790 SECURITY_SERVER_MSG_TYPE_PID_RESPONSE,
791 SECURITY_SERVER_RETURN_CODE_NO_SUCH_COOKIE);
792 if(retval != SECURITY_SERVER_SUCCESS)
794 SEC_SVR_DBG("ERROR: Cannot send pid response: %d", retval);
801 int process_smack_request(int sockfd)
803 int retval, client_pid;
804 int * privileges = NULL;
805 unsigned char requested_cookie[SECURITY_SERVER_COOKIE_LEN];
806 cookie_list *search_result = NULL;
807 //handler for SMACK label
809 //buffer for storing file path
810 const int BUFFSIZE = 30;
814 /* Authenticate client */
815 retval = authenticate_client_middleware(sockfd, &client_pid);
816 if(retval != SECURITY_SERVER_SUCCESS)
818 SEC_SVR_DBG("%s", "Client Authentication Failed");
819 retval = send_generic_response(sockfd,
820 SECURITY_SERVER_MSG_TYPE_SMACK_RESPONSE,
821 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
822 if(retval != SECURITY_SERVER_SUCCESS)
824 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
829 retval = recv_smack_request(sockfd, requested_cookie);
830 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED)
832 SEC_SVR_DBG("%s", "Receiving request failed");
833 retval = send_generic_response(sockfd,
834 SECURITY_SERVER_MSG_TYPE_SMACK_RESPONSE,
835 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
836 if(retval != SECURITY_SERVER_SUCCESS)
838 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
843 retval = get_client_gid_list(sockfd, &privileges);
846 SEC_SVR_DBG("ERROR: Cannot get GID list");
850 /* Search cookie list */
851 pthread_mutex_lock(&cookie_mutex);
852 search_result = search_cookie(c_list, requested_cookie, privileges, retval);
853 pthread_mutex_unlock(&cookie_mutex);
857 if(search_result != NULL)
860 SEC_SVR_DBG("We found the cookie and pid:%d", search_result->pid);
861 SEC_SVR_DBG("%s", "Cookie comparison succeeded. Access granted.");
864 memset(path, 0x00, BUFFSIZE);
866 //preparing file path
867 snprintf(path, BUFFSIZE, "/proc/%d/attr/current", search_result->pid);
868 SEC_SVR_DBG("Path to file: %s\n", path);
870 //allocation place for label
871 label = calloc(SMACK_LABEL_LEN, 1);
874 SEC_SVR_DBG("Client ERROR: Memory allocation error");
878 //clearing buffer for label
879 memset(label, 0x00, SMACK_LABEL_LEN);
881 //opening file /proc/<pid>/attr/curent with SMACK label
882 fd = open(path, O_RDONLY);
885 SEC_SVR_DBG("Client ERROR: Unable to open file in /proc");
889 //reading label from file, it is NOT NULL TERMINATED
890 retval = read(fd, label, SMACK_LABEL_LEN);
894 SEC_SVR_DBG("Client ERROR: Unable to read from file");
898 SEC_SVR_DBG("Readed label is: %s\n", label);
900 retval = send_smack(sockfd, label);
902 if(retval != SECURITY_SERVER_SUCCESS)
904 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
910 SEC_SVR_DBG("%s", "Could not find the cookie");
911 retval = send_generic_response(sockfd,
912 SECURITY_SERVER_MSG_TYPE_SMACK_RESPONSE,
913 SECURITY_SERVER_RETURN_CODE_NO_SUCH_COOKIE);
914 if(retval != SECURITY_SERVER_SUCCESS)
916 SEC_SVR_DBG("ERROR: Cannot send SMACK label response: %d", retval);
926 int process_tool_request(int client_sockfd, int server_sockfd)
928 int retval, argcnum = 0;
929 char **recved_argv = NULL;
931 /* Authenticate client */
932 retval = authenticate_developer_shell(client_sockfd);
933 if(retval != SECURITY_SERVER_SUCCESS)
935 SEC_SVR_DBG("%s", "Client Authentication Failed");
936 retval = send_generic_response(client_sockfd,
937 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
938 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
939 if(retval != SECURITY_SERVER_SUCCESS)
941 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
946 /* Receive Total number of argv */
947 retval = TEMP_FAILURE_RETRY(read(client_sockfd, &argcnum, sizeof(int)));
948 if((retval < (int)sizeof(int)) || argcnum > (UINT_MAX/sizeof(char *))-2 || argcnum < 0)
950 SEC_SVR_DBG("Error: argc recieve failed: %d", retval);
951 retval = send_generic_response(client_sockfd,
952 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
953 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
954 if(retval != SECURITY_SERVER_SUCCESS)
956 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
961 recved_argv = (char **)malloc(sizeof(char *) * argcnum);
962 if(recved_argv == NULL)
964 SEC_SVR_DBG("Error: malloc() failed: %d", retval);
965 retval = send_generic_response(client_sockfd,
966 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
967 SECURITY_SERVER_RETURN_CODE_SERVER_ERROR);
968 if(retval != SECURITY_SERVER_SUCCESS)
970 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
974 memset(recved_argv, 0, sizeof(char *) * argcnum);
976 retval = recv_launch_tool_request(client_sockfd, argcnum-1, recved_argv);
977 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED || retval == SECURITY_SERVER_ERROR_OUT_OF_MEMORY)
979 SEC_SVR_DBG("%s", "Receiving request failed");
980 retval = send_generic_response(client_sockfd,
981 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
982 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
983 if(retval != SECURITY_SERVER_SUCCESS)
985 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
991 SEC_SVR_DBG("Error: Too small number of argv [%d]", argcnum);
992 retval = send_generic_response(client_sockfd,
993 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
994 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
995 if(retval != SECURITY_SERVER_SUCCESS)
997 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1001 /* Execute the command */
1002 retval = execute_debug_tool(argcnum, recved_argv, server_sockfd, client_sockfd);
1003 if(retval != SECURITY_SERVER_SUCCESS)
1005 SEC_SVR_DBG("Error: Cannot execute debug tool [%d]", retval);
1006 retval = send_generic_response(client_sockfd,
1007 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
1008 SECURITY_SERVER_RETURN_CODE_SERVER_ERROR);
1009 if(retval != SECURITY_SERVER_SUCCESS)
1011 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1016 SEC_SVR_DBG("%s", "Tool has been executed");
1017 retval = send_generic_response(client_sockfd,
1018 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
1019 SECURITY_SERVER_RETURN_CODE_SUCCESS);
1020 if(retval != SECURITY_SERVER_SUCCESS)
1022 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1026 free_argv(recved_argv, argcnum);
1030 void *security_server_thread(void *param)
1032 int client_sockfd = -1, client_uid, client_pid;
1033 int server_sockfd, retval, argcnum;
1034 basic_header basic_hdr;
1035 struct security_server_thread_param *my_param;
1037 my_param = (struct security_server_thread_param *) param;
1038 client_sockfd = my_param->client_sockfd;
1039 server_sockfd = my_param->server_sockfd;
1041 /* Receive request header */
1042 retval = recv_hdr(client_sockfd, &basic_hdr);
1043 if(retval == SECURITY_SERVER_ERROR_TIMEOUT || retval == SECURITY_SERVER_ERROR_RECV_FAILED
1044 || retval == SECURITY_SERVER_ERROR_SOCKET)
1046 SEC_SVR_DBG("Receiving header error [%d]",retval);
1047 close(client_sockfd);
1052 if(retval != SECURITY_SERVER_SUCCESS)
1055 SEC_SVR_DBG("Receiving header error [%d]",retval);
1056 retval = send_generic_response(client_sockfd,
1057 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1058 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
1059 if(retval != SECURITY_SERVER_SUCCESS)
1061 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1064 safe_server_sock_close(client_sockfd);
1069 /* Act different for request message ID */
1070 switch(basic_hdr.msg_id)
1072 case SECURITY_SERVER_MSG_TYPE_COOKIE_REQUEST:
1073 SEC_SVR_DBG("%s", "Cookie request received");
1074 process_cookie_request(client_sockfd);
1077 case SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_REQUEST:
1078 SEC_SVR_DBG("%s", "Privilege check received");
1079 process_check_privilege_request(client_sockfd);
1082 case SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_REQUEST:
1083 SEC_SVR_DBG("%s", "Privilege check (new mode) received");
1084 process_check_privilege_new_request(client_sockfd);
1087 case SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_REQUEST:
1088 SEC_SVR_DBG("%s", "Get object name request received");
1089 process_object_name_request(client_sockfd);
1092 case SECURITY_SERVER_MSG_TYPE_GID_REQUEST:
1093 SEC_SVR_DBG("%s", "Get GID received");
1094 process_gid_request(client_sockfd, (int)basic_hdr.msg_len);
1097 case SECURITY_SERVER_MSG_TYPE_PID_REQUEST:
1098 SEC_SVR_DBG("%s", "pid request received");
1099 process_pid_request(client_sockfd);
1102 case SECURITY_SERVER_MSG_TYPE_SMACK_REQUEST:
1103 SEC_SVR_DBG("%s", "SMACK label request received");
1104 process_smack_request(client_sockfd);
1107 case SECURITY_SERVER_MSG_TYPE_TOOL_REQUEST:
1108 SEC_SVR_DBG("%s", "launch tool request received");
1109 process_tool_request(client_sockfd, server_sockfd);
1112 case SECURITY_SERVER_MSG_TYPE_VALID_PWD_REQUEST:
1113 SEC_SVR_DBG("%s", "Server: validate password request received");
1114 process_valid_pwd_request(client_sockfd);
1117 case SECURITY_SERVER_MSG_TYPE_SET_PWD_REQUEST:
1118 SEC_SVR_DBG("%s", "Server: set password request received");
1119 process_set_pwd_request(client_sockfd);
1122 case SECURITY_SERVER_MSG_TYPE_RESET_PWD_REQUEST:
1123 SEC_SVR_DBG("%s", "Server: reset password request received");
1124 process_reset_pwd_request(client_sockfd);
1127 case SECURITY_SERVER_MSG_TYPE_CHK_PWD_REQUEST:
1128 SEC_SVR_DBG("%s", "Server: check password request received");
1129 process_chk_pwd_request(client_sockfd);
1132 case SECURITY_SERVER_MSG_TYPE_SET_PWD_HISTORY_REQUEST:
1133 SEC_SVR_DBG("%s", "Server: set password histroy request received");
1134 process_set_pwd_history_request(client_sockfd);
1137 case SECURITY_SERVER_MSG_TYPE_SET_PWD_MAX_CHALLENGE_REQUEST:
1138 SEC_SVR_DBG("%s", "Server: set password max challenge request received");
1139 process_set_pwd_max_challenge_request(client_sockfd);
1142 case SECURITY_SERVER_MSG_TYPE_SET_PWD_VALIDITY_REQUEST:
1143 SEC_SVR_DBG("%s", "Server: set password validity request received");
1144 process_set_pwd_validity_request(client_sockfd);
1147 /************************************************************************************************/
1148 /* Just for test. This code must be removed on release */
1149 case SECURITY_SERVER_MSG_TYPE_GET_ALL_COOKIES_REQUEST:
1150 SEC_SVR_DBG("%s", "all cookie info request received -- NEED TO BE DELETED ON RELEASE");
1151 retval = authenticate_client_application(client_sockfd, &client_pid, &client_uid);
1152 if(retval != SECURITY_SERVER_SUCCESS)
1154 SEC_SVR_DBG("%s", "Client Authentication Failed");
1155 retval = send_generic_response(client_sockfd,
1156 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1157 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
1158 if(retval != SECURITY_SERVER_SUCCESS)
1160 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1164 retval = util_process_all_cookie(client_sockfd, c_list);
1165 if(retval != SECURITY_SERVER_SUCCESS)
1167 SEC_SVR_DBG("ERROR: Cannot send all cookie info: %d", retval);
1171 case SECURITY_SERVER_MSG_TYPE_GET_COOKIEINFO_FROM_PID_REQUEST:
1172 SEC_SVR_DBG("%s", "cookie info from pid request received -- NEED TO BE DELETED ON RELEASE");
1173 if(retval != SECURITY_SERVER_SUCCESS)
1175 SEC_SVR_DBG("%s", "Client Authentication Failed");
1176 retval = send_generic_response(client_sockfd,
1177 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1178 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
1179 if(retval != SECURITY_SERVER_SUCCESS)
1181 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1185 util_process_cookie_from_pid(client_sockfd, c_list);
1188 case SECURITY_SERVER_MSG_TYPE_GET_COOKIEINFO_FROM_COOKIE_REQUEST:
1189 SEC_SVR_DBG("%s", "cookie info from cookie request received -- NEED TO BE DELETED ON RELEASE");
1190 if(retval != SECURITY_SERVER_SUCCESS)
1192 SEC_SVR_DBG("%s", "Client Authentication Failed");
1193 retval = send_generic_response(client_sockfd,
1194 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1195 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
1196 if(retval != SECURITY_SERVER_SUCCESS)
1198 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1202 util_process_cookie_from_cookie(client_sockfd, c_list);
1204 /************************************************************************************************/
1208 SEC_SVR_DBG("Unknown msg ID :%d", basic_hdr.msg_id);
1209 /* Unknown message ID */
1210 retval = send_generic_response(client_sockfd,
1211 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1212 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
1213 if(retval != SECURITY_SERVER_SUCCESS)
1215 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1220 if(client_sockfd > 0)
1222 safe_server_sock_close(client_sockfd);
1227 if(client_sockfd > 0)
1228 close(client_sockfd);
1229 thread_status[my_param->thread_status] = 0;
1230 pthread_detach(pthread_self());
1234 void *security_server_main_thread(void *data)
1236 int server_sockfd = 0, retval, client_sockfd = -1, rc;
1237 struct sigaction act, dummy;
1238 pthread_t threads[SECURITY_SERVER_NUM_THREADS];
1239 struct security_server_thread_param param[SECURITY_SERVER_NUM_THREADS];
1243 SEC_SVR_DBG("%s", "Starting Security Server main thread");
1245 /* security server must be executed by root */
1248 fprintf(stderr, "%s\n", "You are not root. exiting...");
1252 for(retval = 0 ; retval < SECURITY_SERVER_NUM_THREADS; retval++)
1253 thread_status[retval] = 0;
1256 /* Create and bind a Unix domain socket */
1257 retval = create_new_socket(&server_sockfd);
1258 if(retval != SECURITY_SERVER_SUCCESS)
1260 SEC_SVR_DBG("%s", "cannot create socket. exiting...");
1264 if(listen(server_sockfd, 5) < 0)
1266 SEC_SVR_DBG("%s", "listen() failed. exiting...");
1270 /* Create a default cookie --> Cookie for root process */
1271 c_list = create_default_cookie();
1274 SEC_SVR_DBG("%s", "cannot make a default cookie. exiting...");
1278 /* Init signal handler */
1279 act.sa_handler = NULL;
1280 act.sa_sigaction = security_server_sig_child;
1281 sigemptyset(&act.sa_mask);
1282 act.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
1284 if (sigaction(SIGCHLD, &act, &dummy) < 0)
1286 SEC_SVR_DBG("%s", "cannot change session");
1289 pthread_mutex_init(&cookie_mutex, NULL);
1293 /* Accept a new client */
1294 if(client_sockfd < 0)
1295 client_sockfd = accept_client(server_sockfd);
1297 if(client_sockfd == SECURITY_SERVER_ERROR_TIMEOUT)
1299 if(client_sockfd < 0)
1301 SEC_SVR_DBG("Server: new connection has been accepted: %d", client_sockfd);
1305 if(thread_status[retval] == 0)
1307 thread_status[retval] = 1;
1308 param[retval].client_sockfd = client_sockfd;
1309 param[retval].server_sockfd = server_sockfd;
1310 param[retval].thread_status= retval;
1311 SEC_SVR_DBG("Server: Creating a new thread: %d", retval);
1312 rc =pthread_create(&threads[retval], NULL, security_server_thread, (void *)¶m[retval]);
1315 SEC_SVR_DBG("Error: Server: Cannot create thread:%d", rc);
1321 if(retval >= SECURITY_SERVER_NUM_THREADS)
1327 if(server_sockfd > 0)
1328 close(server_sockfd);
1330 pthread_detach(pthread_self());
1334 int main(int argc, char* argv[])
1337 pthread_t main_thread;
1342 res = pthread_create(&main_thread, NULL, security_server_main_thread, NULL);
1350 SEC_SVR_DBG("Error: Server: Cannot create main security server thread: %d", res);