|
Lines 126-140
typedef struct {
Link Here
|
| 126 |
|
126 |
|
| 127 |
/* List of all permitted host/port pairs to connect by the user. */ |
127 |
/* List of all permitted host/port pairs to connect by the user. */ |
| 128 |
static ForwardPermission *permitted_opens = NULL; |
128 |
static ForwardPermission *permitted_opens = NULL; |
|
|
129 |
static ForwardPermission *permitted_remote_opens = NULL; |
| 129 |
|
130 |
|
| 130 |
/* List of all permitted host/port pairs to connect by the admin. */ |
131 |
/* List of all permitted host/port pairs to connect by the admin. */ |
| 131 |
static ForwardPermission *permitted_adm_opens = NULL; |
132 |
static ForwardPermission *permitted_adm_opens = NULL; |
|
|
133 |
static ForwardPermission *permitted_adm_remote_opens = NULL; |
| 132 |
|
134 |
|
| 133 |
/* Number of permitted host/port pairs in the array permitted by the user. */ |
135 |
/* Number of permitted host/port pairs in the array permitted by the user. */ |
| 134 |
static int num_permitted_opens = 0; |
136 |
static int num_permitted_opens = 0; |
|
|
137 |
static int num_permitted_remote_opens = 0; |
| 135 |
|
138 |
|
| 136 |
/* Number of permitted host/port pair in the array permitted by the admin. */ |
139 |
/* Number of permitted host/port pair in the array permitted by the admin. */ |
| 137 |
static int num_adm_permitted_opens = 0; |
140 |
static int num_adm_permitted_opens = 0; |
|
|
141 |
static int num_adm_permitted_remote_opens = 0; |
| 138 |
|
142 |
|
| 139 |
/* special-case port number meaning allow any port */ |
143 |
/* special-case port number meaning allow any port */ |
| 140 |
#define FWD_PERMIT_ANY_PORT 0 |
144 |
#define FWD_PERMIT_ANY_PORT 0 |
|
Lines 148-153
static int num_adm_permitted_opens = 0;
Link Here
|
| 148 |
* anything after logging in anyway. |
152 |
* anything after logging in anyway. |
| 149 |
*/ |
153 |
*/ |
| 150 |
static int all_opens_permitted = 0; |
154 |
static int all_opens_permitted = 0; |
|
|
155 |
static int all_remote_opens_permitted = 0; |
| 151 |
|
156 |
|
| 152 |
|
157 |
|
| 153 |
/* -- X11 forwarding */ |
158 |
/* -- X11 forwarding */ |
|
Lines 3816-3821
channel_permit_all_opens(void)
Link Here
|
| 3816 |
if (num_permitted_opens == 0) |
3821 |
if (num_permitted_opens == 0) |
| 3817 |
all_opens_permitted = 1; |
3822 |
all_opens_permitted = 1; |
| 3818 |
} |
3823 |
} |
|
|
3824 |
void |
| 3825 |
channel_permit_all_remote_opens(void) |
| 3826 |
{ |
| 3827 |
if (num_permitted_remote_opens == 0) |
| 3828 |
all_remote_opens_permitted = 1; |
| 3829 |
} |
| 3830 |
|
| 3819 |
|
3831 |
|
| 3820 |
void |
3832 |
void |
| 3821 |
channel_add_permitted_opens(char *host, int port) |
3833 |
channel_add_permitted_opens(char *host, int port) |
|
Lines 3835-3840
channel_add_permitted_opens(char *host, int port)
Link Here
|
| 3835 |
all_opens_permitted = 0; |
3847 |
all_opens_permitted = 0; |
| 3836 |
} |
3848 |
} |
| 3837 |
|
3849 |
|
|
|
3850 |
void |
| 3851 |
channel_add_permitted_remote_opens(int port) |
| 3852 |
{ |
| 3853 |
debug("allow remote port forwarding %d", port); |
| 3854 |
|
| 3855 |
permitted_remote_opens = xreallocarray(permitted_remote_opens, |
| 3856 |
num_permitted_remote_opens + 1, sizeof(*permitted_remote_opens)); |
| 3857 |
permitted_remote_opens[num_permitted_remote_opens].listen_port = port; |
| 3858 |
num_permitted_remote_opens++; |
| 3859 |
|
| 3860 |
all_remote_opens_permitted = 0; |
| 3861 |
} |
| 3862 |
|
| 3838 |
/* |
3863 |
/* |
| 3839 |
* Update the listen port for a dynamic remote forward, after |
3864 |
* Update the listen port for a dynamic remote forward, after |
| 3840 |
* the actual 'newport' has been allocated. If 'newport' < 0 is |
3865 |
* the actual 'newport' has been allocated. If 'newport' < 0 is |
|
Lines 3884-3889
channel_add_adm_permitted_opens(char *host, int port)
Link Here
|
| 3884 |
return ++num_adm_permitted_opens; |
3909 |
return ++num_adm_permitted_opens; |
| 3885 |
} |
3910 |
} |
| 3886 |
|
3911 |
|
|
|
3912 |
int |
| 3913 |
channel_add_adm_permitted_remote_opens(int port) |
| 3914 |
{ |
| 3915 |
debug("config allows remote port forwarding, port %d", port); |
| 3916 |
|
| 3917 |
permitted_adm_remote_opens = xreallocarray(permitted_adm_remote_opens, |
| 3918 |
num_adm_permitted_remote_opens + 1, sizeof(*permitted_adm_remote_opens)); |
| 3919 |
permitted_adm_remote_opens[num_adm_permitted_remote_opens].listen_port = port; |
| 3920 |
return ++num_adm_permitted_remote_opens; |
| 3921 |
} |
| 3922 |
|
| 3923 |
|
| 3887 |
void |
3924 |
void |
| 3888 |
channel_disable_adm_local_opens(void) |
3925 |
channel_disable_adm_local_opens(void) |
| 3889 |
{ |
3926 |
{ |
|
Lines 3894-3899
channel_disable_adm_local_opens(void)
Link Here
|
| 3894 |
} |
3931 |
} |
| 3895 |
|
3932 |
|
| 3896 |
void |
3933 |
void |
|
|
3934 |
channel_disable_adm_remote_opens(void) |
| 3935 |
{ |
| 3936 |
channel_clear_adm_permitted_remote_opens(); |
| 3937 |
permitted_adm_remote_opens = xmalloc(sizeof(*permitted_adm_remote_opens)); |
| 3938 |
permitted_adm_remote_opens[num_adm_permitted_remote_opens].host_to_connect = NULL; |
| 3939 |
num_adm_permitted_remote_opens = 1; |
| 3940 |
} |
| 3941 |
|
| 3942 |
void |
| 3897 |
channel_clear_permitted_opens(void) |
3943 |
channel_clear_permitted_opens(void) |
| 3898 |
{ |
3944 |
{ |
| 3899 |
int i; |
3945 |
int i; |
|
Lines 3909-3914
channel_clear_permitted_opens(void)
Link Here
|
| 3909 |
} |
3955 |
} |
| 3910 |
|
3956 |
|
| 3911 |
void |
3957 |
void |
|
|
3958 |
channel_clear_permitted_remote_opens(void) |
| 3959 |
{ |
| 3960 |
|
| 3961 |
free(permitted_remote_opens); |
| 3962 |
permitted_remote_opens = NULL; |
| 3963 |
num_permitted_remote_opens = 0; |
| 3964 |
} |
| 3965 |
|
| 3966 |
|
| 3967 |
void |
| 3912 |
channel_clear_adm_permitted_opens(void) |
3968 |
channel_clear_adm_permitted_opens(void) |
| 3913 |
{ |
3969 |
{ |
| 3914 |
int i; |
3970 |
int i; |
|
Lines 3924-3929
channel_clear_adm_permitted_opens(void)
Link Here
|
| 3924 |
} |
3980 |
} |
| 3925 |
|
3981 |
|
| 3926 |
void |
3982 |
void |
|
|
3983 |
channel_clear_adm_permitted_remote_opens(void) |
| 3984 |
{ |
| 3985 |
free(permitted_adm_remote_opens); |
| 3986 |
permitted_adm_remote_opens = NULL; |
| 3987 |
num_adm_permitted_remote_opens = 0; |
| 3988 |
} |
| 3989 |
|
| 3990 |
|
| 3991 |
void |
| 3927 |
channel_print_adm_permitted_opens(void) |
3992 |
channel_print_adm_permitted_opens(void) |
| 3928 |
{ |
3993 |
{ |
| 3929 |
int i; |
3994 |
int i; |
|
Lines 4217-4222
channel_connect_to_path(const char *path, char *ctype, char *rname)
Link Here
|
| 4217 |
return connect_to(path, PORT_STREAMLOCAL, ctype, rname); |
4282 |
return connect_to(path, PORT_STREAMLOCAL, ctype, rname); |
| 4218 |
} |
4283 |
} |
| 4219 |
|
4284 |
|
|
|
4285 |
static int |
| 4286 |
remote_port_match(u_short allowedport, u_short requestedport) |
| 4287 |
{ |
| 4288 |
if (allowedport == FWD_PERMIT_ANY_PORT || |
| 4289 |
allowedport == requestedport) |
| 4290 |
return 1; |
| 4291 |
return 0; |
| 4292 |
} |
| 4293 |
|
| 4294 |
/* Check if remote port is permitted and connect. */ |
| 4295 |
int |
| 4296 |
channel_connect_remote_to(u_short port) |
| 4297 |
{ |
| 4298 |
int i, permit, permit_adm = 1; |
| 4299 |
int allowed_port = 0; |
| 4300 |
|
| 4301 |
permit = all_remote_opens_permitted; |
| 4302 |
if (!permit) { |
| 4303 |
for (i = 0; i < num_permitted_remote_opens; i++) { |
| 4304 |
allowed_port = permitted_remote_opens[i].listen_port; |
| 4305 |
debug("i=%d check remote permitted vs requested " |
| 4306 |
"%u vs %u", i, allowed_port, port); |
| 4307 |
if ( remote_port_match(allowed_port, port)) { |
| 4308 |
debug2("i=%d found match remote permitted vs " |
| 4309 |
"requested %u==%u", i, allowed_port, port); |
| 4310 |
permit = 1; |
| 4311 |
break; |
| 4312 |
} |
| 4313 |
} |
| 4314 |
} |
| 4315 |
if (num_adm_permitted_remote_opens > 0) { |
| 4316 |
permit_adm = 0; |
| 4317 |
for (i = 0; i < num_adm_permitted_remote_opens; i++) |
| 4318 |
allowed_port = permitted_adm_remote_opens[i].listen_port; |
| 4319 |
if (remote_port_match(allowed_port, port) ) { |
| 4320 |
/* && strcmp(permitted_adm_remote_opens[i].host_to_connect, host) == 0) */ |
| 4321 |
debug2("i=%d found match admin remote permitted vs " |
| 4322 |
"requested %u==%u", i, allowed_port, port); |
| 4323 |
permit_adm = 1; |
| 4324 |
} |
| 4325 |
} |
| 4326 |
|
| 4327 |
if (!permit || !permit_adm) { |
| 4328 |
logit("Received request to forward remote port %d, " |
| 4329 |
"but the request was denied. return %d", port, permit); |
| 4330 |
return 0; |
| 4331 |
} |
| 4332 |
return ( permit | permit_adm); |
| 4333 |
} |
| 4334 |
|
| 4335 |
|
| 4336 |
|
| 4220 |
void |
4337 |
void |
| 4221 |
channel_send_window_changes(void) |
4338 |
channel_send_window_changes(void) |
| 4222 |
{ |
4339 |
{ |
|
Lines 4670-4672
auth_request_forwarding(void)
Link Here
|
| 4670 |
packet_send(); |
4787 |
packet_send(); |
| 4671 |
packet_write_wait(); |
4788 |
packet_write_wait(); |
| 4672 |
} |
4789 |
} |
|
|
4790 |
|