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>
35 #include "security-server-cookie.h"
36 #include "security-server-common.h"
37 #include "security-server-password.h"
38 #include "security-server-comm.h"
40 /* Set cookie as a global variable */
42 pthread_mutex_t cookie_mutex;
43 int thread_status[SECURITY_SERVER_NUM_THREADS];
44 struct security_server_thread_param {
50 /************************************************************************************************/
51 /* Just for test. This code must be removed on release */
52 #include "security-server-util.h"
53 /************************************************************************************************/
56 void printhex(unsigned char *data, int size)
64 printf("%X ", data[i]);
65 if(((i+1) % 16) == 0 && i != 0)
71 void print_cookie(cookie_list *list)
74 printf("%s", "cookie:\n");
75 printhex(list->cookie, SECURITY_SERVER_COOKIE_LEN);
76 printf("path_len: %d\n", list->path_len);
77 printf("permission_len: %d\n", list->permission_len);
78 printf("PID: %d\n", list->pid);
79 printf("path: %s\n", list->path);
80 printf("%s", "permissions: ");
81 for(i=0;i<list->permission_len;i++)
83 printf("%d ", list->permissions[i]);
86 printf("prev: %p\n", list->prev);
87 printf("next: %p\n", list->next);
91 /* Object name is actually name of a Group ID *
92 * This function opens /etc/group file and search group ID and
93 * returns the string */
94 int search_object_name(int gid, char *obj, int obj_size)
97 char *linebuf = NULL, *token = NULL, *token2, *tempstr = NULL;
98 int ret = 0, tmp_gid, bufsize;
99 fp = fopen("/etc/group", "r");
102 /* cannot open /etc/group */
103 SEC_SVR_DBG("%s", "Cannot open /etc/group");
104 return SECURITY_SERVER_ERROR_FILE_OPERATION;
107 linebuf = malloc(128);
111 ret = SECURITY_SERVER_ERROR_OUT_OF_MEMORY;
112 SEC_SVR_DBG("%s", "cannot malloc()");
116 bzero(linebuf, bufsize);
117 ret = SECURITY_SERVER_ERROR_NO_SUCH_OBJECT;
118 while(fgets(linebuf, bufsize, fp) != NULL)
120 while(linebuf[bufsize -2] != 0)
122 linebuf[bufsize -1] = (char) fgetc(fp);
123 tempstr = realloc(linebuf, bufsize + 128);
126 ret = SECURITY_SERVER_ERROR_OUT_OF_MEMORY;
130 bzero(linebuf + bufsize, 128);
131 fgets(linebuf + bufsize, 128, fp);
135 token = strtok(linebuf, ":"); /* group name */
138 SEC_SVR_DBG("/etc/group is not valid. cannot find gid: [%s]", linebuf);
139 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
142 token2 = strtok(NULL, ":"); /* group password */
145 SEC_SVR_DBG("/etc/group is not valid. cannot find gid: [%s]", linebuf);
146 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
149 token2 = strtok(NULL, ":"); /* gid */
152 SEC_SVR_DBG("/etc/group is not valid. cannot find gid: [%s]", linebuf);
153 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
158 tmp_gid = strtoul(token2, 0, 10);
161 SEC_SVR_DBG("cannot change string to integer [%s]", token2);
162 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
169 if(strlen(token) > obj_size)
171 ret = SECURITY_SERVER_ERROR_BUFFER_TOO_SMALL;
172 SEC_SVR_DBG("buffer is too small. %d --> %d", obj_size, strlen(token));
175 strncpy(obj, token, strlen(token));
176 obj[strlen(token)] = 0;
177 ret = SECURITY_SERVER_SUCCESS;
180 bzero(linebuf, bufsize);
191 /* Search GID from group name *
192 * This function opens /etc/group and search group name by given gid */
193 int search_gid(const char *obj)
196 char *linebuf = NULL, *token = NULL, *token2, *tempstr = NULL;
197 int ret = SECURITY_SERVER_ERROR_NO_SUCH_OBJECT, tmp_gid, bufsize;
199 SEC_SVR_DBG("Searching for object %s", obj);
201 fp = fopen("/etc/group", "r");
204 /* cannot open /etc/group */
205 SEC_SVR_DBG("%s", "cannot open /etc/group");
206 return SECURITY_SERVER_ERROR_FILE_OPERATION;
209 linebuf = malloc(128);
213 ret = SECURITY_SERVER_ERROR_OUT_OF_MEMORY;
214 SEC_SVR_DBG("%s", "Out Of Memory");
218 bzero(linebuf, bufsize);
219 while(fgets(linebuf, bufsize, fp) != NULL)
221 while(linebuf[bufsize -2] != 0 )
223 linebuf[bufsize -1] = (char) fgetc(fp);
224 tempstr = realloc(linebuf, bufsize + 128);
227 ret = SECURITY_SERVER_ERROR_OUT_OF_MEMORY;
231 bzero(linebuf + bufsize, 128);
232 fgets(linebuf + bufsize, 128, fp);
236 token = strtok(linebuf, ":"); /* group name */
237 token2 = strtok(NULL, ":"); /* group password */
238 token2 = strtok(NULL, ":"); /* gid */
241 SEC_SVR_DBG("/etc/group is not valid. cannot find gid: [%s]", linebuf);
242 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
246 tmp_gid = strtoul(token2, 0, 10);
249 SEC_SVR_DBG("cannot change string to integer [%s]", token2);
250 ret = SECURITY_SERVER_ERROR_SERVER_ERROR;
254 if(strcmp(obj, token) == 0)
258 SEC_SVR_DBG("GID of %s is found: %d", obj, ret);
261 bzero(linebuf, bufsize);
272 /* Signal handler for processes */
273 static void security_server_sig_child(int signo, siginfo_t *info, void *data)
279 child_pgid = getpgid(info->si_pid);
280 SEC_SVR_DBG("Signal handler: dead_pid=%d, pgid=%d",info->si_pid,child_pgid);
282 while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) {
283 if(child_pid == child_pgid)
284 killpg(child_pgid,SIGKILL);
290 /* Execute a debugging tool by fork() and execve() */
291 int execute_debug_tool(int argc, char *const *argv, int server_sockfd, int client_sockfd)
294 SEC_SVR_DBG("%s", "Executing tool");
299 close(client_sockfd);
300 close(server_sockfd);
306 ret = execv(argv[0], argv);
309 SEC_SVR_DBG("Error:Failed to execute [%d]", errno);
315 SEC_SVR_DBG("Error: Failed to fork [%d]", errno);
316 return SECURITY_SERVER_ERROR_SERVER_ERROR;
318 return SECURITY_SERVER_SUCCESS;
321 int process_cookie_request(int sockfd)
323 int retval, client_pid, client_uid;
324 cookie_list *created_cookie = NULL;
326 /* Authenticate client */
327 retval = authenticate_client_application(sockfd, &client_pid, &client_uid);
328 if(retval != SECURITY_SERVER_SUCCESS)
330 SEC_SVR_DBG("%s", "Client Authentication Failed");
331 retval = send_generic_response(sockfd,
332 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
333 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
334 if(retval != SECURITY_SERVER_SUCCESS)
336 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
340 /* If client application is root process, just respond default cookie */
344 SEC_SVR_DBG("%s", "Requested application is a root process");
345 created_cookie = c_list;
348 SEC_SVR_DBG("%s", "Cannot read default cookie");
355 //TODO: Remove above code if there will be no crashes without it
356 //All process should be treaded the same
357 /* Create a new cookie. or find existing one */
358 pthread_mutex_lock(&cookie_mutex);
359 created_cookie = create_cookie_item(client_pid, sockfd, c_list);
360 pthread_mutex_unlock(&cookie_mutex);
361 if(created_cookie == NULL)
363 SEC_SVR_DBG("%s","Cannot create a cookie");
367 //let others know if this cookie belongs to root process
369 created_cookie->is_roots_process = 1;
371 created_cookie->is_roots_process = 0;
374 /* send cookie as response */
375 retval = send_cookie(sockfd, created_cookie->cookie);
376 if(retval != SECURITY_SERVER_SUCCESS)
378 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
380 SEC_SVR_DBG("Server: Cookie created for client PID %d LABEL >%s<",
382 (created_cookie->smack_label)?(created_cookie->smack_label):"NULL");
384 SEC_SVR_DBG("%s", "Server: Cookie has been sent to client");
390 int process_check_privilege_request(int sockfd)
392 /* Authenticate client */
393 int retval, client_pid, requested_privilege;
394 unsigned char requested_cookie[SECURITY_SERVER_COOKIE_LEN];
395 cookie_list *search_result = NULL;
397 retval = authenticate_client_middleware(sockfd, &client_pid);
398 if(retval != SECURITY_SERVER_SUCCESS)
400 SEC_SVR_DBG("%s", "Client Authentication Failed");
401 retval = send_generic_response(sockfd,
402 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
403 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
404 if(retval != SECURITY_SERVER_SUCCESS)
406 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
411 retval = recv_check_privilege_request(sockfd,
412 requested_cookie, &requested_privilege);
413 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED)
415 SEC_SVR_DBG("%s", "Receiving request failed");
416 retval = send_generic_response(sockfd,
417 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
418 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
419 if(retval != SECURITY_SERVER_SUCCESS)
421 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
426 if(requested_privilege < 1)
428 SEC_SVR_DBG("Requiring bad privilege [%d]", requested_privilege);
429 retval = send_generic_response(sockfd,
430 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
431 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
432 if(retval != SECURITY_SERVER_SUCCESS)
434 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
439 /* Search cookie list */
440 pthread_mutex_lock(&cookie_mutex);
441 search_result = search_cookie(c_list, requested_cookie, requested_privilege);
442 pthread_mutex_unlock(&cookie_mutex);
443 if(search_result != NULL)
446 SEC_SVR_DBG("We found the cookie with %d privilege and pid:%d", requested_privilege, client_pid);
447 SEC_SVR_DBG("%s", "Cookie comparison succeeded. Access granted.");
448 retval = send_generic_response(sockfd,
449 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
450 SECURITY_SERVER_RETURN_CODE_ACCESS_GRANTED);
451 if(retval != SECURITY_SERVER_SUCCESS)
453 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
459 SEC_SVR_DBG("Could not find the cookie with %d privilege", requested_privilege);
460 retval = send_generic_response(sockfd,
461 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_RESPONSE,
462 SECURITY_SERVER_RETURN_CODE_ACCESS_DENIED);
463 if(retval != SECURITY_SERVER_SUCCESS)
465 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
472 int process_check_privilege_new_request(int sockfd)
474 /* Authenticate client */
475 int retval, client_pid, requested_privilege;
476 unsigned char requested_cookie[SECURITY_SERVER_COOKIE_LEN];
477 cookie_list *search_result = NULL;
478 char object_label[MAX_OBJECT_LABEL_LEN+1];
479 char access_rights[MAX_MODE_STR_LEN+1];
481 retval = authenticate_client_middleware(sockfd, &client_pid);
482 if(retval != SECURITY_SERVER_SUCCESS)
484 SEC_SVR_DBG("%s", "Client Authentication Failed");
485 retval = send_generic_response(sockfd,
486 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_RESPONSE,
487 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
488 if(retval != SECURITY_SERVER_SUCCESS)
490 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
495 retval = recv_check_privilege_new_request(
496 sockfd, requested_cookie, object_label, access_rights);
497 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED)
499 SEC_SVR_DBG("%s", "Receiving request failed");
500 retval = send_generic_response(sockfd,
501 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_RESPONSE,
502 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
503 if(retval != SECURITY_SERVER_SUCCESS)
505 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
510 /* Search cookie list */
511 pthread_mutex_lock(&cookie_mutex);
512 search_result = search_cookie_new(c_list, requested_cookie, object_label, access_rights);
513 pthread_mutex_unlock(&cookie_mutex);
515 if(search_result != NULL)
518 SEC_SVR_DBG("We found the cookie with %s rights and pid:%d", access_rights, client_pid);
519 SEC_SVR_DBG("%s", "Cookie comparison succeeded. Access granted.");
520 retval = send_generic_response(sockfd,
521 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_RESPONSE,
522 SECURITY_SERVER_RETURN_CODE_ACCESS_GRANTED);
523 if(retval != SECURITY_SERVER_SUCCESS)
525 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
531 SEC_SVR_DBG("Could not find the cookie with %s rights", access_rights);
532 retval = send_generic_response(sockfd,
533 SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_RESPONSE,
534 SECURITY_SERVER_RETURN_CODE_ACCESS_DENIED);
535 if(retval != SECURITY_SERVER_SUCCESS)
537 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
546 int process_object_name_request(int sockfd)
548 int retval, client_pid, requested_privilege;
549 char object_name[SECURITY_SERVER_MAX_OBJ_NAME];
551 /* Authenticate client */
552 retval = authenticate_client_middleware(sockfd, &client_pid);
553 if(retval != SECURITY_SERVER_SUCCESS)
555 SEC_SVR_DBG("%s", "Client Authentication Failed");
556 retval = send_generic_response(sockfd,
557 SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_RESPONSE,
558 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
559 if(retval != SECURITY_SERVER_SUCCESS)
561 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
567 retval = read(sockfd, &requested_privilege, sizeof(requested_privilege));
568 if (retval < sizeof(requested_privilege))
570 SEC_SVR_DBG("%s", "Receiving request failed");
571 retval = send_generic_response(sockfd,
572 SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_RESPONSE,
573 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
574 if(retval != SECURITY_SERVER_SUCCESS)
576 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
581 /* Search from /etc/group */
582 retval = search_object_name(requested_privilege,
584 SECURITY_SERVER_MAX_OBJ_NAME);
585 if (retval == SECURITY_SERVER_ERROR_NO_SUCH_OBJECT)
588 SEC_SVR_DBG("There is no such object for gid [%d]", requested_privilege);
589 retval = send_generic_response(sockfd,
590 SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_RESPONSE,
591 SECURITY_SERVER_RETURN_CODE_NO_SUCH_OBJECT);
592 if(retval != SECURITY_SERVER_SUCCESS)
594 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
598 if(retval != SECURITY_SERVER_SUCCESS)
601 SEC_SVR_DBG("Error on searching object name [%d]", retval);
602 retval = send_generic_response(sockfd,
603 SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_RESPONSE,
604 SECURITY_SERVER_RETURN_CODE_SERVER_ERROR);
605 if(retval != SECURITY_SERVER_SUCCESS)
607 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
613 SEC_SVR_DBG("We found object: %s", object_name);
614 retval = send_object_name(sockfd, object_name);
615 if(retval != SECURITY_SERVER_SUCCESS)
617 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
624 int process_gid_request(int sockfd, int msg_len)
626 int retval, client_pid;
627 char object_name[SECURITY_SERVER_MAX_OBJ_NAME];
628 /* Authenticate client as middleware daemon */
629 retval = authenticate_client_middleware(sockfd, &client_pid);
630 if(retval != SECURITY_SERVER_SUCCESS)
632 SEC_SVR_DBG("%s", "Client authentication failed");
633 retval = send_generic_response(sockfd,
634 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
635 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
636 if(retval != SECURITY_SERVER_SUCCESS)
638 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
643 if(msg_len >= SECURITY_SERVER_MAX_OBJ_NAME)
645 /* Too big ojbect name */
646 SEC_SVR_DBG("%s", "Object name is too big");
647 retval = send_generic_response(sockfd,
648 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
649 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
650 if(retval != SECURITY_SERVER_SUCCESS)
652 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
657 /* Receive group name */
658 retval = read(sockfd, object_name, msg_len);
659 if (retval < msg_len )
661 SEC_SVR_DBG("%s", "Failed to read object name");
662 retval = send_generic_response(sockfd,
663 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
664 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
665 if(retval != SECURITY_SERVER_SUCCESS)
667 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
671 object_name[msg_len] = 0;
673 /* Search /etc/group for the given group name */
674 retval = search_gid(object_name);
675 if (retval == SECURITY_SERVER_ERROR_NO_SUCH_OBJECT)
678 SEC_SVR_DBG("The object [%s] is not exist", object_name);
679 retval = send_generic_response(sockfd,
680 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
681 SECURITY_SERVER_RETURN_CODE_NO_SUCH_OBJECT);
682 if(retval != SECURITY_SERVER_SUCCESS)
684 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
692 SEC_SVR_DBG("Cannot send the response. %d", retval);
693 retval = send_generic_response(sockfd,
694 SECURITY_SERVER_MSG_TYPE_GID_RESPONSE,
695 SECURITY_SERVER_RETURN_CODE_SERVER_ERROR);
696 if(retval != SECURITY_SERVER_SUCCESS)
698 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
704 retval = send_gid(sockfd, retval);
705 if(retval != SECURITY_SERVER_SUCCESS)
707 SEC_SVR_DBG("ERROR: Cannot gid response: %d", retval);
713 int process_pid_request(int sockfd)
715 int retval, client_pid;
716 unsigned char requested_cookie[SECURITY_SERVER_COOKIE_LEN];
717 cookie_list *search_result = NULL;
719 /* Authenticate client */
720 retval = authenticate_client_middleware(sockfd, &client_pid);
721 if(retval != SECURITY_SERVER_SUCCESS)
723 SEC_SVR_DBG("%s", "Client Authentication Failed");
724 retval = send_generic_response(sockfd,
725 SECURITY_SERVER_MSG_TYPE_PID_RESPONSE,
726 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
727 if(retval != SECURITY_SERVER_SUCCESS)
729 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
734 retval = recv_pid_request(sockfd, requested_cookie);
735 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED)
737 SEC_SVR_DBG("%s", "Receiving request failed");
738 retval = send_generic_response(sockfd,
739 SECURITY_SERVER_MSG_TYPE_PID_RESPONSE,
740 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
741 if(retval != SECURITY_SERVER_SUCCESS)
743 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
748 /* Search cookie list */
749 pthread_mutex_lock(&cookie_mutex);
750 search_result = search_cookie(c_list, requested_cookie, 0);
751 pthread_mutex_unlock(&cookie_mutex);
752 if(search_result != NULL)
755 SEC_SVR_DBG("We found the cookie and pid:%d", search_result->pid);
756 SEC_SVR_DBG("%s", "Cookie comparison succeeded. Access granted.");
757 retval = send_pid(sockfd, search_result->pid);
759 if(retval != SECURITY_SERVER_SUCCESS)
761 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
767 SEC_SVR_DBG("%s", "Could not find the cookie");
768 retval = send_generic_response(sockfd,
769 SECURITY_SERVER_MSG_TYPE_PID_RESPONSE,
770 SECURITY_SERVER_RETURN_CODE_NO_SUCH_COOKIE);
771 if(retval != SECURITY_SERVER_SUCCESS)
773 SEC_SVR_DBG("ERROR: Cannot send pid response: %d", retval);
780 int process_smack_request(int sockfd)
782 int retval, client_pid;
783 unsigned char requested_cookie[SECURITY_SERVER_COOKIE_LEN];
784 cookie_list *search_result = NULL;
785 //handler for SMACK label
787 //buffer for storing file path
788 const int BUFFSIZE = 30;
792 /* Authenticate client */
793 retval = authenticate_client_middleware(sockfd, &client_pid);
794 if(retval != SECURITY_SERVER_SUCCESS)
796 SEC_SVR_DBG("%s", "Client Authentication Failed");
797 retval = send_generic_response(sockfd,
798 SECURITY_SERVER_MSG_TYPE_SMACK_RESPONSE,
799 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
800 if(retval != SECURITY_SERVER_SUCCESS)
802 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
807 retval = recv_smack_request(sockfd, requested_cookie);
808 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED)
810 SEC_SVR_DBG("%s", "Receiving request failed");
811 retval = send_generic_response(sockfd,
812 SECURITY_SERVER_MSG_TYPE_SMACK_RESPONSE,
813 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
814 if(retval != SECURITY_SERVER_SUCCESS)
816 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
821 /* Search cookie list */
822 pthread_mutex_lock(&cookie_mutex);
823 search_result = search_cookie(c_list, requested_cookie, 0);
824 pthread_mutex_unlock(&cookie_mutex);
825 if(search_result != NULL)
828 SEC_SVR_DBG("We found the cookie and pid:%d", search_result->pid);
829 SEC_SVR_DBG("%s", "Cookie comparison succeeded. Access granted.");
832 memset(path, 0x00, BUFFSIZE);
834 //preparing file path
835 snprintf(path, BUFFSIZE, "/proc/%d/attr/current", search_result->pid);
836 SEC_SVR_DBG("Path to file: %s\n", path);
838 //allocation place for label
839 label = calloc(SMACK_LABEL_LEN, 1);
842 SEC_SVR_DBG("Client ERROR: Memory allocation error");
846 //clearing buffer for label
847 memset(label, 0x00, SMACK_LABEL_LEN);
849 //opening file /proc/<pid>/attr/curent with SMACK label
850 fd = open(path, O_RDONLY);
853 SEC_SVR_DBG("Client ERROR: Unable to open file in /proc");
857 //reading label from file, it is NOT NULL TERMINATED
858 retval = read(fd, label, SMACK_LABEL_LEN);
862 SEC_SVR_DBG("Client ERROR: Unable to read from file");
866 SEC_SVR_DBG("Readed label is: %s\n", label);
868 retval = send_smack(sockfd, label);
870 if(retval != SECURITY_SERVER_SUCCESS)
872 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
878 SEC_SVR_DBG("%s", "Could not find the cookie");
879 retval = send_generic_response(sockfd,
880 SECURITY_SERVER_MSG_TYPE_SMACK_RESPONSE,
881 SECURITY_SERVER_RETURN_CODE_NO_SUCH_COOKIE);
882 if(retval != SECURITY_SERVER_SUCCESS)
884 SEC_SVR_DBG("ERROR: Cannot send SMACK label response: %d", retval);
894 int process_tool_request(int client_sockfd, int server_sockfd)
897 char **recved_argv = NULL;
899 /* Authenticate client */
900 retval = authenticate_developer_shell(client_sockfd);
901 if(retval != SECURITY_SERVER_SUCCESS)
903 SEC_SVR_DBG("%s", "Client Authentication Failed");
904 retval = send_generic_response(client_sockfd,
905 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
906 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
907 if(retval != SECURITY_SERVER_SUCCESS)
909 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
914 /* Receive Total number of argv */
916 retval = read(client_sockfd, &argcnum, sizeof(int));
917 if((retval < sizeof(int)) || argcnum > (UINT_MAX/sizeof(char *))-2 || argcnum < 0)
919 SEC_SVR_DBG("Error: argc recieve failed: %d", retval);
920 retval = send_generic_response(client_sockfd,
921 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
922 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
923 if(retval != SECURITY_SERVER_SUCCESS)
925 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
930 recved_argv = (char **)malloc(sizeof(char *) * argcnum);
931 if(recved_argv == NULL)
933 SEC_SVR_DBG("Error: malloc() failed: %d", retval);
934 retval = send_generic_response(client_sockfd,
935 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
936 SECURITY_SERVER_RETURN_CODE_SERVER_ERROR);
937 if(retval != SECURITY_SERVER_SUCCESS)
939 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
943 memset(recved_argv, 0, sizeof(char *) * argcnum);
945 retval = recv_launch_tool_request(client_sockfd, argcnum -1, recved_argv);
946 if(retval == SECURITY_SERVER_ERROR_RECV_FAILED || retval == SECURITY_SERVER_ERROR_OUT_OF_MEMORY)
948 SEC_SVR_DBG("%s", "Receiving request failed");
950 retval = send_generic_response(client_sockfd,
951 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
952 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
953 if(retval != SECURITY_SERVER_SUCCESS)
955 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
961 SEC_SVR_DBG("Error: Too small number of argv [%d]", argcnum);
962 retval = send_generic_response(client_sockfd,
963 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
964 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
965 if(retval != SECURITY_SERVER_SUCCESS)
967 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
971 /* Execute the command */
972 retval = execute_debug_tool(argcnum, recved_argv, server_sockfd, client_sockfd);
973 if(retval != SECURITY_SERVER_SUCCESS)
975 SEC_SVR_DBG("Error: Cannot execute debug tool [%d]", retval);
976 retval = send_generic_response(client_sockfd,
977 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
978 SECURITY_SERVER_RETURN_CODE_SERVER_ERROR);
979 if(retval != SECURITY_SERVER_SUCCESS)
981 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
986 SEC_SVR_DBG("%s", "Tool has been executed");
987 retval = send_generic_response(client_sockfd,
988 SECURITY_SERVER_MSG_TYPE_TOOL_RESPONSE,
989 SECURITY_SERVER_RETURN_CODE_SUCCESS);
990 if(retval != SECURITY_SERVER_SUCCESS)
992 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
996 if(recved_argv != NULL)
999 free_argv(recved_argv, argcnum);
1006 void *security_server_thread(void *param)
1008 int client_sockfd = -1, client_uid, client_pid;
1009 int server_sockfd, retval, argcnum;
1010 basic_header basic_hdr;
1011 struct security_server_thread_param *my_param;
1013 my_param = (struct security_server_thread_param *) param;
1014 client_sockfd = my_param->client_sockfd;
1015 server_sockfd = my_param->server_sockfd;
1017 /* Receive request header */
1018 retval = recv_hdr(client_sockfd, &basic_hdr);
1019 if(retval == SECURITY_SERVER_ERROR_TIMEOUT || retval == SECURITY_SERVER_ERROR_RECV_FAILED
1020 || retval == SECURITY_SERVER_ERROR_SOCKET)
1022 SEC_SVR_DBG("Receiving header error [%d]",retval);
1023 close(client_sockfd);
1028 if(retval != SECURITY_SERVER_SUCCESS)
1031 SEC_SVR_DBG("Receiving header error [%d]",retval);
1032 retval = send_generic_response(client_sockfd,
1033 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1034 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
1035 if(retval != SECURITY_SERVER_SUCCESS)
1037 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1040 safe_server_sock_close(client_sockfd);
1045 /* Act different for request message ID */
1046 switch(basic_hdr.msg_id)
1048 case SECURITY_SERVER_MSG_TYPE_COOKIE_REQUEST:
1049 SEC_SVR_DBG("%s", "Cookie request received");
1050 process_cookie_request(client_sockfd);
1053 case SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_REQUEST:
1054 SEC_SVR_DBG("%s", "Privilege check received");
1055 process_check_privilege_request(client_sockfd);
1058 case SECURITY_SERVER_MSG_TYPE_CHECK_PRIVILEGE_NEW_REQUEST:
1059 SEC_SVR_DBG("%s", "Privilege check (new mode) received");
1060 process_check_privilege_new_request(client_sockfd);
1063 case SECURITY_SERVER_MSG_TYPE_OBJECT_NAME_REQUEST:
1064 SEC_SVR_DBG("%s", "Get object name request received");
1065 process_object_name_request(client_sockfd);
1068 case SECURITY_SERVER_MSG_TYPE_GID_REQUEST:
1069 SEC_SVR_DBG("%s", "Get GID received");
1070 process_gid_request(client_sockfd, (int)basic_hdr.msg_len);
1073 case SECURITY_SERVER_MSG_TYPE_PID_REQUEST:
1074 SEC_SVR_DBG("%s", "pid request received");
1075 process_pid_request(client_sockfd);
1078 case SECURITY_SERVER_MSG_TYPE_SMACK_REQUEST:
1079 SEC_SVR_DBG("%s", "SMACK label request received");
1080 process_smack_request(client_sockfd);
1083 case SECURITY_SERVER_MSG_TYPE_TOOL_REQUEST:
1084 SEC_SVR_DBG("%s", "launch tool request received");
1085 process_tool_request(client_sockfd, server_sockfd);
1088 case SECURITY_SERVER_MSG_TYPE_VALID_PWD_REQUEST:
1089 SEC_SVR_DBG("%s", "Server: validate password request received");
1090 process_valid_pwd_request(client_sockfd);
1093 case SECURITY_SERVER_MSG_TYPE_SET_PWD_REQUEST:
1094 SEC_SVR_DBG("%s", "Server: set password request received");
1095 process_set_pwd_request(client_sockfd);
1098 case SECURITY_SERVER_MSG_TYPE_RESET_PWD_REQUEST:
1099 SEC_SVR_DBG("%s", "Server: reset password request received");
1100 process_reset_pwd_request(client_sockfd);
1103 case SECURITY_SERVER_MSG_TYPE_CHK_PWD_REQUEST:
1104 SEC_SVR_DBG("%s", "Server: check password request received");
1105 process_chk_pwd_request(client_sockfd);
1108 case SECURITY_SERVER_MSG_TYPE_SET_PWD_HISTORY_REQUEST:
1109 SEC_SVR_DBG("%s", "Server: set password histroy request received");
1110 process_set_pwd_history_request(client_sockfd);
1113 case SECURITY_SERVER_MSG_TYPE_SET_PWD_MAX_CHALLENGE_REQUEST:
1114 SEC_SVR_DBG("%s", "Server: set password max challenge request received");
1115 process_set_pwd_max_challenge_request(client_sockfd);
1118 case SECURITY_SERVER_MSG_TYPE_SET_PWD_VALIDITY_REQUEST:
1119 SEC_SVR_DBG("%s", "Server: set password validity request received");
1120 process_set_pwd_validity_request(client_sockfd);
1123 /************************************************************************************************/
1124 /* Just for test. This code must be removed on release */
1125 case SECURITY_SERVER_MSG_TYPE_GET_ALL_COOKIES_REQUEST:
1126 SEC_SVR_DBG("%s", "all cookie info request received -- NEED TO BE DELETED ON RELEASE");
1127 retval = authenticate_client_application(client_sockfd, &client_pid, &client_uid);
1128 if(retval != SECURITY_SERVER_SUCCESS)
1130 SEC_SVR_DBG("%s", "Client Authentication Failed");
1131 retval = send_generic_response(client_sockfd,
1132 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1133 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
1134 if(retval != SECURITY_SERVER_SUCCESS)
1136 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1140 retval = util_process_all_cookie(client_sockfd, c_list);
1141 if(retval != SECURITY_SERVER_SUCCESS)
1143 SEC_SVR_DBG("ERROR: Cannot send all cookie info: %d", retval);
1147 case SECURITY_SERVER_MSG_TYPE_GET_COOKIEINFO_FROM_PID_REQUEST:
1148 SEC_SVR_DBG("%s", "cookie info from pid request received -- NEED TO BE DELETED ON RELEASE");
1149 if(retval != SECURITY_SERVER_SUCCESS)
1151 SEC_SVR_DBG("%s", "Client Authentication Failed");
1152 retval = send_generic_response(client_sockfd,
1153 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1154 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
1155 if(retval != SECURITY_SERVER_SUCCESS)
1157 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1161 util_process_cookie_from_pid(client_sockfd, c_list);
1164 case SECURITY_SERVER_MSG_TYPE_GET_COOKIEINFO_FROM_COOKIE_REQUEST:
1165 SEC_SVR_DBG("%s", "cookie info from cookie request received -- NEED TO BE DELETED ON RELEASE");
1166 if(retval != SECURITY_SERVER_SUCCESS)
1168 SEC_SVR_DBG("%s", "Client Authentication Failed");
1169 retval = send_generic_response(client_sockfd,
1170 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1171 SECURITY_SERVER_RETURN_CODE_AUTHENTICATION_FAILED);
1172 if(retval != SECURITY_SERVER_SUCCESS)
1174 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1178 util_process_cookie_from_cookie(client_sockfd, c_list);
1180 /************************************************************************************************/
1184 SEC_SVR_DBG("Unknown msg ID :%d", basic_hdr.msg_id);
1185 /* Unknown message ID */
1186 retval = send_generic_response(client_sockfd,
1187 SECURITY_SERVER_MSG_TYPE_GENERIC_RESPONSE,
1188 SECURITY_SERVER_RETURN_CODE_BAD_REQUEST);
1189 if(retval != SECURITY_SERVER_SUCCESS)
1191 SEC_SVR_DBG("ERROR: Cannot send generic response: %d", retval);
1196 if(client_sockfd > 0)
1198 safe_server_sock_close(client_sockfd);
1203 if(client_sockfd > 0)
1204 close(client_sockfd);
1205 thread_status[my_param->thread_status] = 0;
1206 pthread_detach(pthread_self());
1210 void *security_server_main_thread(void *data)
1212 int server_sockfd = 0, retval, client_sockfd = -1, args[2], rc;
1213 struct sigaction act, dummy;
1214 pthread_t threads[SECURITY_SERVER_NUM_THREADS];
1215 struct security_server_thread_param param[SECURITY_SERVER_NUM_THREADS];
1217 SEC_SVR_DBG("%s", "Starting Security Server main thread");
1219 /* security server must be executed by root */
1222 fprintf(stderr, "%s\n", "You are not root. exiting...");
1226 for(retval = 0 ; retval < SECURITY_SERVER_NUM_THREADS; retval++)
1227 thread_status[retval] = 0;
1230 /* Create and bind a Unix domain socket */
1231 retval = create_new_socket(&server_sockfd);
1232 if(retval != SECURITY_SERVER_SUCCESS)
1234 SEC_SVR_DBG("%s", "cannot create socket. exiting...");
1238 if(listen(server_sockfd, 5) < 0)
1240 SEC_SVR_DBG("%s", "listen() failed. exiting...");
1244 /* Create a default cookie --> Cookie for root process */
1245 c_list = create_default_cookie();
1248 SEC_SVR_DBG("%s", "cannot make a default cookie. exiting...");
1252 /* Init signal handler */
1253 act.sa_handler = NULL;
1254 act.sa_sigaction = security_server_sig_child;
1255 sigemptyset(&act.sa_mask);
1256 act.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
1258 if (sigaction(SIGCHLD, &act, &dummy) < 0)
1260 SEC_SVR_DBG("%s", "cannot change session");
1263 pthread_mutex_init(&cookie_mutex, NULL);
1267 /* Accept a new client */
1268 if(client_sockfd < 0)
1269 client_sockfd = accept_client(server_sockfd);
1271 if(client_sockfd == SECURITY_SERVER_ERROR_TIMEOUT)
1273 if(client_sockfd < 0)
1275 SEC_SVR_DBG("Server: new connection has been accepted: %d", client_sockfd);
1279 if(thread_status[retval] == 0)
1281 thread_status[retval] = 1;
1282 param[retval].client_sockfd = client_sockfd;
1283 param[retval].server_sockfd = server_sockfd;
1284 param[retval].thread_status= retval;
1285 SEC_SVR_DBG("Server: Creating a new thread: %d", retval);
1286 rc =pthread_create(&threads[retval], NULL, security_server_thread, (void *)¶m[retval]);
1289 SEC_SVR_DBG("Error: Server: Cannot create thread:%d", rc);
1295 if(retval >= SECURITY_SERVER_NUM_THREADS)
1301 if(server_sockfd > 0)
1302 close(server_sockfd);
1304 pthread_detach(pthread_self());
1308 int main(int argc, char* argv[])
1311 pthread_t main_thread;
1313 res = pthread_create(&main_thread, NULL, security_server_main_thread, NULL);
1321 SEC_SVR_DBG("Error: Server: Cannot create main security server thread: %d", res);